====== Algorytmy copy i copy_n ======
Funkcja **copy** kopiuje elementy od pierwszego do ostatniego z kontenera pierwszego wstawiając je od elementu result kontenera docelowego. Używa przypisania
*result = *first, *(result + 1) = *(first + 1) ...
Elementy [first, last) z kontenera wzorcowego zostają skopiowane do elementów [resutl, result + (last-first)) kontenera docelowego.
Analogicznie działa funkcja **copy_n**, tylko zamiast końca przedziału last pobiera liczbę elementów do skopiowania - n.
Elementy [first, last) z kontenera wzorcowego zostają skopiowane do elementów [resutl, result + n) kontenera docelowego.
Elementy są kopiowane od pierwszego do ostatniego.
===== Deklaracja =====
**copy** w pliku nagłówkowym algorithm:
template
OutputIterator copy(InputIterator first, InputIterator last,
OutputIterator result);
**copy_n** w pliku nagłówkowym algo.h:
template
OutputIterator copy_n(InputIterator first, Size count,
OutputIterator result);
===== Parametry =====
* **first** - iterator wskazujący na pierwszy element do kopiowania z kontenera
* **last** - iterator na jeden element za ostatnim do kopiowania z kontenera
* **result** - iterator na pierwszy element docelowego kontenera
* **count** - liczba elementów do skopiowania
===== Wymagania odnośnie parametrów =====
* n >= 0//
* [first, last) jest poprawnym przedziałem//
* [first, last) nie nachodzi na result. Jeśli nachodzi to wynik może być inny niż zamierzenia autora. Elementy są kopiowane od pierwszego do ostatniego, więc ostatnie elementy będą niepoprawne.
* [result, result + n) lub [result, result + (last-first) ) są poprawnymi przedziałami
===== Zwracana wartość =====
Funkcja zwraca iterator na pierwszy za ostatnim zmienionm w zbiorze docelowym elementem.
===== Wymagania na parametryzowane typy =====
* InputIterator - iterator z funkcją pre i postinkrementacji a także wyłuskania wskazywanego elementu do odczytu
* OutputIterator - iterator z funkcją pre i postinkrementacji a także nadpisania wskazywanego obiektu operatorem '='.
* InsertIterator - przykład OutputIterator, który tworzy nowy element w kontenerze gdy zostanie na nim wywołany operator przyrównania. Uzycie tego operatora pozwala kopiować elementy do pustych kontenerów.
===== Złożoność =====
Algorytmy copy i copy_n mają złożoność liniową i równą N lub (last-first).
===== Przykład użycia =====
Plik cpp do pobrania {{copy-copy_n.cpp}}.
Krótki przykład:
//wektory: v zawiera el. 0-19, v3 zawiera 10 el. 0
//iteratory piaty, dziesiaty, pietnasty - wskazują na konkretne elementy wektora v
//iterator temp - pomocniczy
//Kopiowanie elementów 10-15 z wektora v do el. 0-5 do wektora v3
//i zapisanie w temp iteratora na pierwszy za ostatnim zmienionym elementem w v3
temp = copy(dziesiaty, pietnasty, v3.begin());
copy(v3.begin(), v3.end(), ostream_iterator(std::cout, " "));
cout << endl;
//10 11 12 13 14 0 0 0 0 0
//Kopiowanie 5 elementów od 0 z wektora v do wektora v3 w miejsca od 6
//temp wskazuje na 6ty element v3
copy_n(v.begin(), 5, temp);
copy(v3.begin(), v3.end(), ostream_iterator(std::cout, " "));
cout << endl;
//10 11 12 13 14 0 1 2 3 4