Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <tchar.h>
- #include <iostream>
- #include <algorithm>
- #include <vector>
- #include <list>
- #include <deque>
- #include <iterator>
- // CLASS_08: Przykłady algorytmów
- using namespace std;
- // Funkcja do drukowania zawartości dowolnego kontenera
- // Użycie szablonu dla iteratora umożliwia uniwersalne zastosowanie funkcji dla różnych kontenerów
- template <typename Iterator>
- void Print(Iterator begin, Iterator end)
- {
- // algorytm "for_each" - wykonuje zadaną operację dla każdego elementu kontenera
- // w tym przypadku operacja podana jest jako funkcja anonimowa (lambda)
- for_each(begin, end, [](typename Iterator::value_type& item) { cout << item << ' '; });
- cout << endl;
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- // testowy kontener
- vector<int> vec = { 2, 5, 4, 1, 6, 3 };
- // przykład algorytmu min_element/max_element
- // algorytmy pracują na iteratorach, więc zwracają też iteratory (pozycje elementów w kontenerze)
- auto minpos = min_element(vec.cbegin(), vec.cend());
- cout << "min: " << *minpos << endl;
- auto maxpos = max_element(next(vec.cbegin()), vec.cbegin() + 3);
- cout << "max: " << *maxpos << endl;
- // przykład algorytmu find - zwraca pozycję elementu spełniającego kryterium wyszukiwania lub iterator "end"
- auto pos = find(vec.cbegin(), vec.cend(), 0);
- // test wartości zwracanego iteratora umożliwia sprawdzenie czy poszukiwany element istnieje czy nie
- if (pos != vec.end()) {
- cout << "pos: " << *pos << endl;
- }
- else {
- cout << "0 not found" << endl;
- }
- // wersja algorytmu find z predykatem wyszukiwania w postaci funkcji lambda
- auto pos2 = find_if(vec.begin(), vec.end(), [](int n) { return n > 5; });
- // algorytm reverse - odwrócenie zawartości kontenera pomiędzy iteratorami
- reverse(vec.begin(), pos2);
- Print(vec.begin(), vec.end());
- list<int> lst1, lst2;
- lst1.resize(vec.size());
- // algorytm copy - kopiuje zawartość jednego kontenera do innego
- // Uwaga! docelowy kontener musi mieć rozmiar przynajmniej tak duży jak liczba elementów do skopiowania,
- // stąd wywołanie "resize" powyżej
- copy(vec.begin(), vec.end(), lst1.begin());
- Print(lst1.begin(), lst1.end());
- deque<int> deq;
- // algorytm copy wraz z wykorzystaniem insert_iterator (back_inserter) w celu wypełnienia nowego, pustego kontenera w locie
- copy(vec.begin(), vec.end(), back_inserter(deq));
- Print(deq.begin(), deq.end());
- int c = 10;
- // algorytm transform - pracuje na dwóch kontenerach, wypełnia drugi kontener wartościami z pierwszego kontenera przekształconymi
- // zgodnie z operacją podaną jako funktor. Tutaj również można wykorzystać insert_iterator do wypełnienia pustego kontenera w locie.
- // Dodatkowo tutaj użycie funkcji anonimowej (lambda) umożliwia przekazanie do operacji przekształcającej zmiennej "c" z zewnątrz
- // bez konieczności zmiany sygnatury funkcji podawanej jako parametr do "transform"
- transform(lst1.begin(), lst1.end(), back_inserter(lst2), [&c](int n) { return n*n + c; });
- Print(lst2.begin(), lst2.end());
- // algorytm remove - nie usuwa on fizycznie elementów z kontenera, ponieważ nie ma dostępu do samego kontenera, a jedynie do
- // jego iteratorów. Przesuwa usunięte elementy na koniec kontenera i zwraca nowy koniec "logiczny"
- auto log_end = remove(lst1.begin(), lst1.end(), 4);
- Print(lst1.begin(), log_end);
- std::cout << "Size after remove: " << lst1.size() << std::endl;
- // algorytm erase usuwa elementy pomiędzy podanymi iteratorami
- lst1.erase(log_end, lst1.end());
- Print(lst1.begin(), lst1.end());
- std::cout << "Size after erase: " << lst1.size() << std::endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement