====== Algorytmy remove remove_if ====== **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. ===== Nagłówek dla algorytmów remove i remove_if ===== #include ===== Opis algorytmu remove ===== === Definicja algorytmu remove === 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; } === Parametry algorytmu remove=== * first - iterator identyfikujący początek zakresu elementów * last - interator identyfikujący koniec zakresu elementów * value - wartość, która ma zostać logicznie usunięta === Wartość zwracana algorytmu remove === Iterator do pierwszego elementu za końcem przedziału zawierającego wszystkie "nieusunięte" elementy. === Jak algorytm NIE działa === Algorymt remove niczego fizycznie nie usuwa, dlatego liczebność elementów zawartych w kontenerze nigdy się nie zmienia. === Działanie algorytmu === 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”. {{:remove.jpg|}} === Przykład użycia algorytmu remove === int main(){ vector 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; } ===== Opis algorytmu remove_if ===== === Definicja algorytmu remove_if === 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; } === Parametry algorytmu remove_if === * first - iterator identyfikujący początek zakresu elementów. * last - interator identyfikujący koniec zakresu elementów. * pred - predykat do spełnienia. ===Wartość zwracana algorytmu remove == Iterator do pierwszego elementu za końcem przedziału zawierającego wszystkie "nieusunięte" elementy. === Jak algorytm NIE działa ? === Algorytm remove_if tak jak algorytm remove niczego fizycznie nie usuwa, dlatego liczebność elementów zawartych w kontenerze nigdy się nie zmienia. === Działanie algorytmu === 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. === Przykład użycia algorytmu remove_if === //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 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; }