Narzędzia użytkownika

Narzędzia witryny


remove_remove_if

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<algorithm> 

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”.

Przykład użycia algorytmu remove

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

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<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;
}
remove_remove_if.txt · ostatnio zmienione: 2009/04/29 11:37 przez piotrek