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.
#include <algorithm>
template<class Bi, class Bi2> Bi2 copy_backward(Bi first, Bi last, Bi2 result) { while (first != last) *--result = *--last; return result; }
zwracany iterator na koniec sekwencji wyjściowej.
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.
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 )
vector<int> v1; vector<int> 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<string> v3; v3.push_back("Nick"); v3.push_back("uszkodzil"); v3.push_back("bolid"); v3.push_back("Roberta"); // "Nick uszkodzil bolid Roberta" vector<string> 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<string> output( cout, " " ); copy(v3.begin(), v3.end(), output); //dobrze copy_backward(v3.begin(), v3.end(), output); //bląd!