Algorytm remove_copy kopiuje elementy pewnej kolekcji do innej omijajac obiekty, które sa rowne zadanej wartosci. Algorytm remove_copy_if kopiuje elementy pewnej kolekcji do innej. Element jest kopiowany, jezeli nie zostal spelniony pewien warunek. W przeciwnym przypadku element zostaje pominięty. Funkcje te stosowane sa do operacji na kontenerach, aby poprawic czytelnosc kodu oraz zaoszczedzic programiscie czas.
#include <algorithm>
template<class ForwardIterator, class OutputIterator, class Type> inline OutputIterator remove_copy( ForwardIterator First, ForwardIterator Last, OutputIterator Result, const T& Value )
template<class ForwardIterator, class OutputIterator, class Predicate> inline OutputIterator remove_copy_if( ForwardIterator First, ForwardIterator Last, OutputIterator Result, Predicate Pred )
First - Poczatkowy element kolekcji zrodlowej. Last - Koncowy element kolekcji zrodlowej. Result - Iterator na kolekcje, do ktorej kopiowane sa dane. Value - Wartosc, ktora ma byc pomijana podczas kopiowania.
Firstt - Poczatkowy element kolekcji zrodlowej. Last - Koncowy element kolekcji zrodlowej. Result - Iterator na kolekcje, do ktorej kopiowane sa dane. Pred - Warunek okreslajacy czy wartosc ma zostac skopiowana.
Obie funkcje zwracaja iterator na koniec nowej kolekcji.
Obie funkcje pracuja w czasie liniowym.
std::list<std::string> kolekcja_zrodlowa; //Tworzymy przykladowa kolekcje obiektow kolekcja_zrodlowa.push_back("Adam"); //i wypelniamy ja przykladowymi wartosciami kolekcja_zrodlowa.push_back("Ewa"); kolekcja_zrodlowa.push_back("Usun"); kolekcja_zrodlowa.push_back("Ela"); kolekcja_zrodlowa.push_back("Usun"); kolekcja_zrodlowa.push_back("Jola"); kolekcja_zrodlowa.push_back("Ola");
std::list<std::string> kolekcja_docelowa1; //Tworzymy kolekcje, do ktorej kopiowala bedzie funkcja remove_copy std::string warunek="Usun"; //Tworzymy zmienna przechowujaca napis, ktory ma nie byc kopiowany kolekcja_docelowa1.resize(10); std::list<std::string>::iterator doc1_iterator; //Funkcja ma skopiowac kolekcja_zrodlowa do kolekcja_docelowa1 pomijajac wartosc "Usun" doc1_iterator = remove_copy(kolekcja_zrodlowa.begin(), kolekcja_zrodlowa.end(), kolekcja_docelowa1.begin(), warunek);
std::list<std::string> kolekcja_docelowa2; //Tworzymy kolekcje, do ktorej kopiowala bedzie funkcja remove_copy_if kolekcja_docelowa2.resize(10); std::list<std::string>::iterator doc2_iterator; //Funkcja ma skopiowac kolekcja_zrodlowa do kolekcja_docelowa1 pomijajac wartosci //dla ktorych Predykat() == true doc2_iterator = remove_copy_if(kolekcja_zrodlowa.begin(), kolekcja_zrodlowa.end(), kolekcja_docelowa2.begin(), Predykat);
bool Predykat(std::string element){ //Funkcja warunek, ktora zostaje wywolywana przez funkcje remove_copy_if aby sprawdzic, //czy dany element nalezy usunac. if(element=="Usun" || element[0] == 'E') return true; //Jezeli element=="Usun" lub pierwszy znak elementu to "E", wtedy nie kopiujemy. return false; }