Zaliczane są do rodziny algorytmów mutujących biblioteki standardowej C++.
* 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)
* odwraca kolejność elementów podczas kopiowania z zakresu źródłowego
#include <algorithm>
dla iteratorów wstawiających:
#include <iterator>
template <class BidirectionalIterator> void reverse ( BidirectionalIterator first, BidirectionalIterator last ) { while ((first!=last)&&(first!=--last)) swap (*first++,*last); }
template <class BidirectionalIterator, class OutputIterator> OutputIterator reverse_copy ( BidirectionalIterator first, BidirectionalIterator last, OutputIterator result ) { while (first!=last) *result++ = *--last; return result; }
first - początek zakresu źródłowego last - koniec zakresu źródłowego
first - początek zakresu źródłowego last - koniec zakresu źródłowego result - iterator wyjściowy wskazujący miejsce zapisu
brak
pozycja za ostatnim elementem w kolekcji docelowej: result + (last - first)
* 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
reverse: liniowa, N/2 zamian
reverse_copy: liniowa, N przypisań
using namespace std; ... vector<string> quote_vector; vector<int> num_vector; list<string> 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");
/* odwrócenie wybranego zakresu elementów */ reverse(quote_vector.begin() + 1, quote_vector.end()); /* użycie optymalnej wersji algorytmu dla listy */ quote_list.reverse();
/* 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());