Перевод этой страницы?:

erase

Синтаксис:

    #include <vector>
    iterator erase( iterator loc );
    iterator erase( iterator start, iterator end );

Функция erase() либо удаляет элемент под итератором loc, либо удаляет элементы между start и end (включая start, но не включая end). Возвращаемое значение - итератор на элемент после последнего удаленного элемента.

Первая версия erase (удаляющая один элемент) выполняется за константное время для списков и за линейное время для векторов, двусторонних очередей и строк. Многоэлементная версия erase всегда требует линейное время.

Например:

    // Создаем вектор, заполняем его первыми десятью буквами алфавита
    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 );
      // Выводим на экран
      for( tempIterator = alphas.begin(); tempIterator != alphas.end(); tempIterator++ ) {
        cout << *tempIterator;
      }
      cout << endl;
    }

Код выведет:

    BCDEFGHIJ
    CDEFGHIJ
    DEFGHIJ
    EFGHIJ
    FGHIJ
    GHIJ
    HIJ
    IJ
    J

В следующем примере erase() вызывается с двумя итераторами в качестве параметров, чтобы удалить несколько элементов из вектора:

    // Создаем вектор, заполняем его первыми десятью буквами алфавита
    vector<char> alphas;
    for( int i=0; i < 10; i++ ) {
      alphas.push_back( i + 65 );
    }
    // Выводим полный вектор
    for( int i = 0; i < alphas.size(); i++ ) {
      cout << alphas[i];
    }
    cout << endl;
 
    // Используем erase, чтобы удалить все элементы вектора, кроме первых двух
    //  и последних трех
    alphas.erase( alphas.begin()+2, alphas.end()-3 );
    // Выводим измененный вектор
    for( int i = 0; i < alphas.size(); i++ ) {
      cout << alphas[i];
    }
    cout << endl;

После запуска код выведет:

    ABCDEFGHIJ
    ABHIJ

Нужно обращаться аккуратно со всеми контейнерами при вставке или удалении элементов, так как итераторы могут стать недействительными.

Следующий пример работает для вектора. Здесь после вызова erase() все итераторы (и указатели), следующие за стираемым элементом, становятся недействительными. В примере стираются элементы по условию (сотрутся буквы B и D).

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

После запуска код выведет:

    ACEFGHIJ

Смотри также: clear, insert, pop_back