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 19:58] piotrek |
remove_remove_if [2009/04/29 11:37] (aktualna) 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 11: | Linia 11: | ||
| === Definicja algorytmu remove === | === Definicja algorytmu remove === | ||
| <code cpp>template < class ForwardIterator, class T > | <code cpp>template < class ForwardIterator, class T > | ||
| - | ForwardIterator remove ( ForwardIterator first, ForwardIterator last, const T& value ){ | + | ForwardIterator remove ( ForwardIterator first, ForwardIterator last, const T& value ){ |
| ForwardIterator result = first; | ForwardIterator result = first; | ||
| for ( ; first != last; ++first) | for ( ; first != last; ++first) | ||
| if (!(*first == value)) *result++ = *first; | if (!(*first == value)) *result++ = *first; | ||
| return result; | return result; | ||
| + | } | ||
| + | |||
| + | </code> | ||
| + | |||
| + | === 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 === | ||
| + | <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> | </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> | ||