przejście do zawartości
zpr c++ quick reference
Narzędzia użytkownika
Zarejestruj się!
Zaloguj
Narzędzia witryny
Narzędzia
Pokaż stronę
Poprzednie wersje
Odnośniki
Ostatnie zmiany
Menadżer multimediów
Indeks
Zaloguj
Zarejestruj się!
Ostatnie zmiany
Menadżer multimediów
Indeks
Ślad:
copy_backward
Ta strona jest tylko do odczytu. Możesz wyświetlić źródła tej strony ale nie możesz ich zmienić.
====== 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 ===== <code cpp> #include <algorithm> </code> ===== Definicja ===== <code cpp> template<class Bi, class Bi2> Bi2 copy_backward(Bi first, Bi last, Bi2 result) { while (first != last) *--result = *--last; return result; } </code> ===== 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 ===== 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: <code cpp> *(result - 1) = *(last - 1) *(result - 2) = *(last - 2) *(result - 3) = *(last - 3) ... *(result - N) = *(last - N) // ( last - N = first ) </code> ===== Przykłady użycia ===== <code cpp> 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 ] </code> <code cpp> // 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 ] print(cout, v2); </code> <code cpp> //Dzialania na napisach vector<string> v3; v3.push_back("Nick"); v3.push_back("uszkodzil"); v3.push_back("bolid"); v3.push_back("Roberta"); print(cout, v3); // "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() ); print(cout, v3); // "Nick uszkodzil bolid swoj i Roberta" </code> **Uwaga!** copy_backward wymaga użycia iteratora dwukierunkowego dla obu kontenerów - wejściowego i wyjściowego <code cpp> ostream_iterator<string> output( cout, " " ); copy(v3.begin(), v3.end(), output); //dobrze copy_backward(v3.begin(), v3.end(), output); //bląd! </code>
copy_backward.1240949208.txt.gz
· ostatnio zmienione: 2009/04/28 22:06 przez
bzaremba
Narzędzia strony
Pokaż stronę
Poprzednie wersje
Odnośniki
Do góry