====== Algorytm copy_backward ======
Zaliczany do algorytmów **modyfikujących** pozwala na kopiowanie **od tyłu** sekwencji z ciągu wejściowego do ciągu wyjściowego.\\ Algorytm najczęściej stosowany, gdy początek ciągu wyjściowego jest w ciągu wejściowym.
===== Nagłówek =====
#include
===== Definicja =====
template Bi2 copy_backward(Bi first, Bi last, Bi2 result)
{
while (first != last) *--result = *--last;
return result;
}
===== Parametry =====
* first - iterator wskazujący na pierwszy element sekwencji wejściowej
* last - iterator wskazujący na pozycje za ostatnim elementem sekwencji wejściowej
* result - iterator wskazujący na pozycje za ostatnim elementem sekwencji wyjściowej
===== Wartość zwracana =====
zwracany iterator na koniec sekwencji wyjściowej.
===== Opis =====
Algorytm kopiuje sekwencję **[first, last)** do sekwencji kończącej się na pozycji poprzedzającej iterator result, czyli do zakresu **[result - (last - first), result)**. Kopiowanie odbywa się od tylu, zaczynając od elementu **(last - 1)** kończąc na **(first)**. Algorytm copy_backward nie zmienia kolejności elementów. Niezbędne jest użycie iteratora dwukierunkowego zarówno dla ciągu wejściowego jak i wyjściowego. Ważne jest, aby w sekwencji wyjściowej było wystarczająco dużo miejsca do skopiowania całego zakresu wejściowego.
=== Schemat działania ===
Kopiowanie opiera się na dekrementacji iteratorów result oraz last i przypisaniu wartości z sekwencji wejściowej do wyjściowej. Dzieje się tak do momentu, gdy iteratory last oraz first nie będą wskazywać na ten sam element. Powyższy proces wygląda następująco:
*(result - 1) = *(last - 1)
*(result - 2) = *(last - 2)
*(result - 3) = *(last - 3)
...
*(result - N) = *(last - N) // ( last - N = first )
===== Przykłady użycia =====
vector v1;
vector v2;
int i = 0;
// ustawienie wartosci poczatkowych wektorow v1 i v2
for(; i < 5; ++i )
{
v1.push_back( i );
v2.push_back( 11*(i + 1) );
}
// v1 = [ 0, 1, 2, 3, 4 ]
// v2 = [ 11, 22, 33, 44, 55 ]
// rozszerzenie i skopiowanie wektora na koniec
v1.resize( 2*v1.size() ); // zwiekszenie rozmiaru wektora
copy_backward( v1.begin(), v1.begin() + v1.size()/2, v1.end() );
// v1 = [ 0, 1, 2, 3, 4, 0, 1, 2, 3, 4 ]
// wstawienie 3 wartosci z wektora v1 w srodek wektora v2
// v2 = [ 11, 22, 33, 44, 55 ]
copy_backward(v1.begin() + 2, v1.end() - 5, v2.end() - 1 );
// v2 = [ 11, 2, 3, 4, 55 ]
//Dzialania na napisach
vector v3;
v3.push_back("Nick");
v3.push_back("uszkodzil");
v3.push_back("bolid");
v3.push_back("Roberta");
// "Nick uszkodzil bolid Roberta"
vector v4;
v3.resize( v3.size() + 2 );
v4.push_back("swoj");
v4.push_back("i");
v4.push_back("Roberta");
copy_backward( v4.begin(), v4.end(), v3.end() );
// "Nick uszkodzil bolid swoj i Roberta"
**Uwaga!** copy_backward wymaga użycia iteratora dwukierunkowego dla obu kontenerów - wejściowego i wyjściowego
ostream_iterator output( cout, " " );
copy(v3.begin(), v3.end(), output); //dobrze
copy_backward(v3.begin(), v3.end(), output); //bląd!
===== Plik z powyższymi przykładami =====
[[http://staff.elka.pw.edu.pl/~rnowak2/zprwiki/lib/exe/fetch.php?id=biblioteka_stl_-_algorytmy&cache=cache&media=copy_backward.cpp|copy_backward.cpp]]