Sintassi:
#include <vector> iterator erase( iterator loc ); iterator erase( iterator start, iterator end );
La funzione erase() cancella l'elemento alla posizione loc, oppure gli elementi alle posizioni indicate dagli iteratori start e end (includendo start, ma con esclusione di end). Il valore ritornato è un iteratore che indica l'ultimo elemento eliminato.
La prima forma di erase() (cancellazione di elemento specifico) gira in tempo costante per le liste e in tempo lineare per i vettori, dequeue e stringhe. La seconda forma invece gira sempre in linear time.
Esempio:
// Create a vector, load it with the first ten characters of the alphabet vector<char> alphas; for( int i=0; i < 10; i++ ) { alphas.push_back( i + 65 ); } int size = alphas.size(); vector<char>::iterator startIterator; vector<char>::iterator tempIterator; for( int i=0; i < size; i++ ) { startIterator = alphas.begin(); alphas.erase( startIterator ); // Display the vector for( tempIterator = alphas.begin(); tempIterator != alphas.end(); tempIterator++ ) { cout << *tempIterator; } cout << endl; }
Il programma produrrebe l'output seguente:
BCDEFGHIJ
CDEFGHIJ
DEFGHIJ
EFGHIJ
FGHIJ
GHIJ
HIJ
IJ
J
Nel prossimo esempio erase() viene chiamata con 2 iteratori per eliminare un intero range di elementi da un vettore:
// create a vector, load it with the first ten characters of the alphabet vector<char> alphas; for( int i=0; i < 10; i++ ) { alphas.push_back( i + 65 ); } // display the complete vector for( int i = 0; i < alphas.size(); i++ ) { cout << alphas[i]; } cout << endl; // use erase to remove all but the first two and last three elements // of the vector alphas.erase( alphas.begin()+2, alphas.end()-3 ); // display the modified vector for( int i = 0; i < alphas.size(); i++ ) { cout << alphas[i]; } cout << endl;
Una volta compilato il codice produrrebbe questo output:
ABCDEFGHIJ
ABHIJ
Con tutti i tipi di contenitori dovete essere caute nell'inserimento o cancellazione di elementi, perché è un'operazione che potrebbe ritornare iteratori invalidi
Ecco un esempio che funziona per std::vector. In particolare vector::erase() invalida tutti gli iteratori (e puntatori) che seguono l'elemento che viene cancellato. L'esempio elimina alcuni elementi a seconda di una condizione (le lettere B e D verranno cancellate)
#include <iostream> #include <vector> #include <iterator> using namespace std; int main() { vector<char> alphas; for( int i=0; i < 10; i++ ) { alphas.push_back( i + 65 ); } vector<char>::iterator iter = alphas.begin(); while( iter != alphas.end() ) { if (*iter == 'B' || *iter == 'D') iter = alphas.erase( iter ); else ++iter; } copy(alphas.begin(), alphas.end(), ostream_iterator<char>(cout, "")); cout << endl; }
L'output del programma è il seguente
ACEFGHIJ