Синтаксис:
#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