====== Algorytm reverse & reverse_copy ====== Zaliczane są do rodziny algorytmów **mutujących** biblioteki standardowej C++.\\ == reverse == * odwraca kolejność elementów wewnątrz podanego zakresu\\ * //std::list// udostępnia funkcję składową //reverse//, oferującą lepszą wydajność (modyfikowane są jedynie powiązania wskaźników wewnątrz listy) == reverse_copy == * odwraca kolejność elementów podczas kopiowania z zakresu źródłowego\\ ===== Nagłówek ===== #include dla iteratorów wstawiających: #include ===== Definicje ===== == reverse == template void reverse ( BidirectionalIterator first, BidirectionalIterator last ) { while ((first!=last)&&(first!=--last)) swap (*first++,*last); } == reverse_copy == template OutputIterator reverse_copy ( BidirectionalIterator first, BidirectionalIterator last, OutputIterator result ) { while (first!=last) *result++ = *--last; return result; } ===== Parametry ===== == reverse == first - początek zakresu źródłowego last - koniec zakresu źródłowego == reverse_copy == first - początek zakresu źródłowego last - koniec zakresu źródłowego result - iterator wyjściowy wskazujący miejsce zapisu ===== Wartość zwracana ===== == reverse == brak == reverse_copy == pozycja za ostatnim elementem w kolekcji docelowej: result + (last - first) ===== Warunki użycia ===== * zakres [first, last) jest prawidłowy\\ * //reverse_copy//: w kontenerze docelowym zapewniona jest odpowiednio duża ilość miejsca lub używane są iteratory wstawiające\\ * //reverse_copy//: zakres źródłowy i docelowy nie zachodzą na siebie ===== Złożoność ===== **reverse**: liniowa, N/2 zamian\\ **reverse_copy**: liniowa, N przypisań ===== Przykłady użycia ===== == stworzenie kolekcji == using namespace std; ... vector quote_vector; vector num_vector; list quote_list; const int nums[] = { 1, 2, 3, 4, 5 }; quote_vector.push_back("przyklad"); quote_vector.push_back("reverse"); quote_vector.push_back("i"); quote_vector.push_back("reverse_copy"); quote_list.push_back("kolejny"); quote_list.push_back("przyklad"); quote_list.push_back("dla"); quote_list.push_back("listy"); == reverse == /* odwrócenie wybranego zakresu elementów */ reverse(quote_vector.begin() + 1, quote_vector.end()); /* użycie optymalnej wersji algorytmu dla listy */ quote_list.reverse(); == reverse_copy == /* odwrócona kopia wybranego zakresu elementów, z wykorzystaniem iteratora, wstawiającego elementy na koniec kolejki */ reverse_copy(quote_vector.begin(), quote_vector.end() - 1, back_inserter(quote_list)); /* użycie algorytmu bez iteratorów wstawiających - kontener docelowy musi zapewnić odpowiednią ilość miejsca */ num_vector.reserve(5); reverse_copy(nums, nums + 5, num_vector.begin());