Narzędzia użytkownika

Narzędzia witryny


reverse_reverse_copy

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 <algorithm>

dla iteratorów wstawiających:

#include <iterator>

Definicje

reverse
template <class BidirectionalIterator>
void reverse ( BidirectionalIterator first, BidirectionalIterator last )
{
    while ((first!=last)&&(first!=--last))
        swap (*first++,*last);
}
reverse_copy
template <class BidirectionalIterator, class OutputIterator>
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<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");
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());
reverse_reverse_copy.txt · ostatnio zmienione: 2009/04/29 00:00 przez mfrancis