Różnice między wybraną wersją a wersją aktualną.
Both sides previous revision Previous revision Next revision | Previous revision Last revision Both sides next revision | ||
remove_remove_if [2009/04/28 20:26] 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. elementów. |
===== Nagłówek dla algorytmów remove i remove_if ===== | ===== Nagłówek dla algorytmów remove i remove_if ===== | ||
Linia 35: | Linia 35: | ||
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 === | === Przykład użycia algorytmu remove === | ||
<code cpp> | <code cpp> | ||
Linia 68: | Linia 69: | ||
} | } | ||
//Nowy logiczny koniec bedzie wskazywal wartosc 8 | //Nowy logiczny koniec bedzie wskazywal wartosc 8 | ||
- | cout << "\nJaka pozycje wskazuje nowy logiczny koniec :" << *NewEnd<< endl; | + | cout << "\nNa jaki element wskazuje NewEnd :" << *NewEnd<< endl; |
return 0; | return 0; | ||
} | } | ||
Linia 84: | Linia 85: | ||
} | } | ||
+ | </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> | </code> |