Advertisement
Guest User

Untitled

a guest
Dec 12th, 2017
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.63 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <tchar.h>
  3. #include <iostream>
  4. #include <algorithm>
  5. #include <vector>
  6. #include <list>
  7. #include <deque>
  8. #include <iterator>
  9.  
  10. // CLASS_08: Przykłady algorytmów
  11.  
  12. using namespace std;
  13.  
  14. // Funkcja do drukowania zawartości dowolnego kontenera
  15. // Użycie szablonu dla iteratora umożliwia uniwersalne zastosowanie funkcji dla różnych kontenerów
  16. template <typename Iterator>
  17. void Print(Iterator begin, Iterator end)
  18. {
  19. // algorytm "for_each" - wykonuje zadaną operację dla każdego elementu kontenera
  20. // w tym przypadku operacja podana jest jako funkcja anonimowa (lambda)
  21. for_each(begin, end, [](typename Iterator::value_type& item) { cout << item << ' '; });
  22. cout << endl;
  23. }
  24.  
  25. int _tmain(int argc, _TCHAR* argv[])
  26. {
  27. // testowy kontener
  28. vector<int> vec = { 2, 5, 4, 1, 6, 3 };
  29.  
  30. // przykład algorytmu min_element/max_element
  31. // algorytmy pracują na iteratorach, więc zwracają też iteratory (pozycje elementów w kontenerze)
  32. auto minpos = min_element(vec.cbegin(), vec.cend());
  33. cout << "min: " << *minpos << endl;
  34.  
  35. auto maxpos = max_element(next(vec.cbegin()), vec.cbegin() + 3);
  36. cout << "max: " << *maxpos << endl;
  37.  
  38. // przykład algorytmu find - zwraca pozycję elementu spełniającego kryterium wyszukiwania lub iterator "end"
  39. auto pos = find(vec.cbegin(), vec.cend(), 0);
  40. // test wartości zwracanego iteratora umożliwia sprawdzenie czy poszukiwany element istnieje czy nie
  41. if (pos != vec.end()) {
  42. cout << "pos: " << *pos << endl;
  43. }
  44. else {
  45. cout << "0 not found" << endl;
  46. }
  47.  
  48. // wersja algorytmu find z predykatem wyszukiwania w postaci funkcji lambda
  49. auto pos2 = find_if(vec.begin(), vec.end(), [](int n) { return n > 5; });
  50.  
  51. // algorytm reverse - odwrócenie zawartości kontenera pomiędzy iteratorami
  52. reverse(vec.begin(), pos2);
  53. Print(vec.begin(), vec.end());
  54.  
  55. list<int> lst1, lst2;
  56. lst1.resize(vec.size());
  57. // algorytm copy - kopiuje zawartość jednego kontenera do innego
  58. // Uwaga! docelowy kontener musi mieć rozmiar przynajmniej tak duży jak liczba elementów do skopiowania,
  59. // stąd wywołanie "resize" powyżej
  60. copy(vec.begin(), vec.end(), lst1.begin());
  61. Print(lst1.begin(), lst1.end());
  62.  
  63. deque<int> deq;
  64. // algorytm copy wraz z wykorzystaniem insert_iterator (back_inserter) w celu wypełnienia nowego, pustego kontenera w locie
  65. copy(vec.begin(), vec.end(), back_inserter(deq));
  66. Print(deq.begin(), deq.end());
  67.  
  68. int c = 10;
  69. // algorytm transform - pracuje na dwóch kontenerach, wypełnia drugi kontener wartościami z pierwszego kontenera przekształconymi
  70. // zgodnie z operacją podaną jako funktor. Tutaj również można wykorzystać insert_iterator do wypełnienia pustego kontenera w locie.
  71. // Dodatkowo tutaj użycie funkcji anonimowej (lambda) umożliwia przekazanie do operacji przekształcającej zmiennej "c" z zewnątrz
  72. // bez konieczności zmiany sygnatury funkcji podawanej jako parametr do "transform"
  73. transform(lst1.begin(), lst1.end(), back_inserter(lst2), [&c](int n) { return n*n + c; });
  74. Print(lst2.begin(), lst2.end());
  75.  
  76. // algorytm remove - nie usuwa on fizycznie elementów z kontenera, ponieważ nie ma dostępu do samego kontenera, a jedynie do
  77. // jego iteratorów. Przesuwa usunięte elementy na koniec kontenera i zwraca nowy koniec "logiczny"
  78. auto log_end = remove(lst1.begin(), lst1.end(), 4);
  79. Print(lst1.begin(), log_end);
  80. std::cout << "Size after remove: " << lst1.size() << std::endl;
  81.  
  82. // algorytm erase usuwa elementy pomiędzy podanymi iteratorami
  83. lst1.erase(log_end, lst1.end());
  84. Print(lst1.begin(), lst1.end());
  85. std::cout << "Size after erase: " << lst1.size() << std::endl;
  86.  
  87. return 0;
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement