remove – usuwa z określonego zakresu elementy równe podanej wartości.
remove_if – usuwa z określonego zakresu elementy, dla których dany predykat jest prawdziwy.
#include<algorithm>
template < class ForwardIterator, class T > ForwardIterator remove ( ForwardIterator first, ForwardIterator last, const T& value ){ ForwardIterator result = first; for ( ; first != last; ++first) if (!(*first == value)) *result++ = *first; return result; }
Iterator do pierwszego elementu za końcem przedziału zawierającego wszystkie „nieusunięte” elementy.
Algorymt remove niczego fizycznie nie usuwa, dlatego liczebność elementów zawartych w kontenerze nigdy się nie zmienia.
Algorymt remove dokonuje przemieszczenia elementów w zadanym mu przy wywołaniu zakresie w taki sposób , by wszystkie te elementy, które nie podlegają „usunięciu”, znalazły się na początku przetwarzanego zakresu i to w takiej samej względnej kolejności. Algorytm zwraca iterator wskazujący pierwszy element za końcem przedziału zawierającego wszystkie „nieusunięte” elementy. Ta wartość jest „nowym logicznym końcem zakresu”.
int main(){ vector<int> v; v.reserve(10); for (int i=1; i<= 10; ++i){ v.push_back(i); } //zostanie wypisana wartosc 10 cout << "Ilosc elementow zawartych w kontenerze " << v.size() << endl; //na ekranie zotanie wyswietlone 1,2,3,4,5,6,7,8,9,10 cout << "Przed uzyciem algorytmu remove : "; for(int i=0; i<=9; ++i){ cout << v[i] << ","; } //kontener zawiera nastepujace elementy 99,2,3,4,5,6,7,8,99,99 v[0] = v[8] = v[9] = 99; //logiczne usuniecie elemntow ktorych wartosc jest rowna 99 vector< int >::iterator NewEnd(remove(v.begin(),v.end(),99)); //po usunieciu liczebnosc elementow zawartych w kontenerze pozostaje TAKA SAMA cout << "\nIlosc elementow zawartych w kontenerze " << v.size() << endl; cout << "Po uzyciu algorytmu remove : "; // na ekranie zostanie wyswietlone 2,3,4,5,6,7,8,8,99,99 // tylko jeden element zostal fizycznie usuniety. for(int i=0; i<=9; ++i){ cout << v[i] << ","; } //Nowy logiczny koniec bedzie wskazywal wartosc 8 cout << "\nNa jaki element wskazuje NewEnd :" << *NewEnd<< endl; return 0; }
template < class ForwardIterator, class Predicate > ForwardIterator remove_if ( ForwardIterator first, ForwardIterator last,Predicate pred ){ ForwardIterator result = first; for ( ; first != last; ++first) if (!pred(*first)) *result++ = *first; return result; }
Iterator do pierwszego elementu za końcem przedziału zawierającego wszystkie „nieusunięte” elementy.
Algorytm remove_if tak jak algorytm remove niczego fizycznie nie usuwa, dlatego liczebność elementów zawartych w kontenerze nigdy się nie zmienia.
Algorytm remove_if podobnie jak algorytm remove tak naprawdę dokonuje przemieszczenia elementów w zadanym mu przy wywołaniu zakresie. Logicznie są usuwane elementy tylko te dla których został spełniony określony predykat.
//Dla algorytmu remove_if zostana usuniete elementy //ktore sa mniejsze od 5 (w naszym przypadku 1,2,3,4) bool lower5(int x){ return x < 5; } int main(){ vector<int> v; v.reserve(10); for (int i=1; i<= 10; ++i){ v.push_back(i); } //zostanie wypisana wartosc 10 cout << "Ilosc elementow zawartych w kontenerze " << v.size() << endl; //na ekranie zotanie wyswietlone 1,2,3,4,5,6,7,8,9,10 cout << "Przed uzyciem algorytmu remove_if : "; for(int i=0; i<=9; ++i){ cout << v[i] << ","; } //usuniete zostana elementy ktorych wartosc jest mniejsza od 5 tzn. 1,2,3,4 vector< int >::iterator NewEnd(remove_if(v.begin(),v.end(),lower5)); //po usunieciu liczebnosc elementow zawartych w kontenerze pozostaje TAKA SAMA tzn. 10 cout << "\nIlosc elementow zawartych w kontenerze " << v.size() << endl; cout << "Po uzyciu algorytmu remove_if : "; // na ekranie zostanie wyswietlone 5,6,7,8,9,10,7,8,9,10 for(int i=0; i<=9; ++i){ cout << v[i] << ","; } //Nowy logiczny koniec bedzie wskazywal wartosc 7 cout << "\nJaki element wskazuje NewEnd :" << *NewEnd<< endl; return 0; }