Narzędzia użytkownika

Narzędzia witryny


copy_backward

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

Definicja

template<class Bi, class Bi2> 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<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!

Plik z powyższymi przykładami

copy_backward.txt · ostatnio zmienione: 2009/04/29 15:45 przez bzaremba