STL - remove e varianti

Dal quinto capitolo di Designing Components with the C++ STL, di Ulrich Breymann. Algoritmi standard.

Sezione dedicata agli algoritmi che modificano le sequenze su cui operano.

5.4.9: remove, remove_if, remove_copy, remove_copy_ir

L'algoritmo remove(), con la sua variazioni, rimuove tutti gli elementi da una sequenza che sono uguali a un dato valore, o che soddifano il predicato passato, e ritorna la fine della sequenza. Le variazione _copy permettono di specificare una diversa destinazione e ritornano un iteratore in scrittura alla successiva posizione.

É da notare che remove() non fa "tutto" il lavoro. Gli elementi sono eliminati, ma il contenitore non viene "ripulito" degli elementi in coda, che risultano perciò duplicati.

Occorre quindi utilizzare l'iteratore tornato da remove() come nuovo "end" della sequenza, e, se necessario, rimuovere gli elementi duplicati in coda alla sequenza:

#include<iostream>
#include<algorithm>
#include<vector>
#include<iterator>
#include<string>
#include<cstring>
#include<algo.h>

using namespace std;

bool isVowel(char c) {
return strchr("aeiouAEIOU", c) != 0;
}

int main() {
vector<char> v(26);
iota(v.begin(), v.end(), 'a');

ostream_iterator<char> output(cout, "");
copy(v.begin(), v.end(), output);
cout << endl;

cout << "remove 't': " << endl;
vector<char>::iterator last = remove(v.begin(), v.end(), 't');
copy(v.begin(), last, output);
cout << endl;

last = remove_if(v.begin(), last, isVowel);
cout << "only consonants left: " << endl;
copy(v.begin(), last, output);
cout << endl;

cout << "complete sequence up to end() (tail is messed up): " << endl;
copy(v.begin(), v.end(), output);
cout << endl;

v.erase(last, v.end());
cout << "complete 'clean' sequence: " << endl;
copy(v.begin(), v.end(), output);
cout << endl;
}

Creo un vettore di caratteri, inizializzato con tutte le lettere dell'alfabeto inglese, dalla a alla z, usando la funzione iota(); chiamo remove() per eliminare tutte le occorrenze di 't' nell'array (evidentemente ce ne era una sola); da qui in posi uso l'iteratore ritornato, last, invece di end(); chiamo remove_if() passando la funzione isVowel() per rimuovere tutte le vocali; rimuovo la coda del vettore, da last a end(), per ottenere un vettore "pulito".

Nessun commento:

Posta un commento