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