====== 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;
}