Traduzioni di questa pagina?:

erase

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

Argomenti correlati: clear, insert, pop_back