Narzędzia użytkownika

Narzędzia witryny


remove_remove_if

Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

Both sides previous revision Previous revision
Next revision
Previous revision
remove_remove_if [2009/04/28 19:54]
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 =====
-  
 <code cpp> #​include<​algorithm>​ </​code>​ <code cpp> #​include<​algorithm>​ </​code>​
 +
 +===== Opis algorytmu remove =====
 +=== Definicja algorytmu remove ===
 +<code cpp>​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;
 +  }
 +
 +</​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>​
 +
 +===== 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>​
remove_remove_if.1240941252.txt.gz · ostatnio zmienione: 2009/04/28 19:54 przez piotrek