Różnice między wybraną wersją a wersją aktualną.
Both sides previous revision Previous revision Next revision | Previous revision | ||
remove_remove_if [2009/04/28 20:23] piotrek |
remove_remove_if [2009/04/29 11:37] piotrek |
||
---|---|---|---|
Linia 1: | Linia 1: | ||
====== Algorytmy remove remove_if ====== | ====== Algorytmy remove remove_if ====== | ||
- | **remove()** – usuwa z określonego zakresu elementy równe podanej wartości. Zwraca iterator do ostatniego z pozostałych elementów. | + | **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. Zwraca iterator do ostatniego z pozostałych elementów. | + | **remove_if** – usuwa z określonego zakresu elementy, dla których dany predykat jest prawdziwy. |
===== Nagłówek dla algorytmów remove i remove_if ===== | ===== Nagłówek dla algorytmów remove i remove_if ===== | ||
Linia 33: | Linia 33: | ||
=== Działanie algorytmu === | === 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. | 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”. | + | 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 === | ||
+ | <code cpp> | ||
+ | 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; | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | ===== Opis algorytmu remove_if ===== | ||
+ | === Definicja algorytmu remove_if === | ||
+ | <code cpp> | ||
+ | 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; | ||
+ | } | ||
+ | |||
+ | </code> | ||
+ | |||
+ | === 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 === | ||
+ | <code cpp> | ||
+ | //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; | ||
+ | } | ||
+ | </code> |