remove
и remove_if
помогают удалять элементы из последовательных контейнеров, то есть из vector
, string
, deque
и list
.Помощь заключается в том, что эти алгоритмы сдвигают элементы и возвращают итератор на начало мусора. Удалять мусор нужно отдельно,
remove
и remove_if
не удаляют физически объекты из контейнера.Например, пускай у нас есть
vector <int>
, содержащий следующие значения.1 2 3 1 2 3 1 2 3
Если вызвать
remove( v.begin(), v.end(), 2 )
//удалить элемент со значением 2 из контейнера v
получится
1 3 1 3 1 3 ? ? ?
где ? - некий мусор. Итератор, который возвратит
remove
, указывает на первый мусорный элемент, в данном случае на третий с конца. Мусорные элементы могут иметь те же значения, что и до вызова remove
, то есть 1 2 3, а могут иметь и любые другие, на это полагаться не стоит. Размер контейнера остается неизменным.Чтобы избавиться от мусора, можно вызвать
erase
. Обычно оба вызова записывают одной строкой и получается что-то вроде.v.erase( remove( v.begin(), v.end(), 2 ), v.end() );
Для
list
алгоритмы std::remove
и std::remove_if
работают крайне неэффективно. Поэтому в list
есть собственная реализация удаления объектов, list::remove
и она быстрая. Элементы там не двигаются, а лишь переставляются ссылки. erase
вызывать уже не нужно, потому что list::remove
уничтожает ненужные элементы сам.Почему
remove
и remove_if
работают именно так? Что мешает удалять элементы сразу и не мучаться лишний раз, вызвая erase
? Дело в том, что remove
не может определить из какого контейнера к нему пришли итераторы, а, следовательно, не может корректно удалить элементы из этого контейнера. Нельзя удалить элементы из контейнера или добавить элементы в контейнер, если на этот контейнер каким-либо образом не была передана ссылка.Ссылки по теме:
Table of Contents: the Standard Template Library
GotW #51: Extending the Standard Library - Part I
comp.lang.c++.moderated "delete elements in associative container"
comp.lang.c++.moderated "The list.erase(remove...) idiom, doing half the job???"
comp.lang.c++.moderated "Two new STL Questions"