Narzędzia użytkownika

Narzędzia witryny


remove_remove_if

To jest stara wersja strony!


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_if() – usuwa z określonego zakresu elementy, dla których dany predykat jest prawdziwy. Zwraca iterator do ostatniego z pozostałych elementów.

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 << "\nJaka pozycje wskazuje nowy logiczny koniec :" <<  *NewEnd<< endl;
	return 0;
}
remove_remove_if.1240943076.txt.gz · ostatnio zmienione: 2009/04/28 20:24 przez piotrek