====== 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]]