Могу ли я продолжать использовать итератор после того, как элемент был удален из std::multimap<>?[дубликат]
Вопрос
На этот вопрос уже есть ответ здесь:
Могу ли я продолжать использовать итератор multimap даже после вызова multimap::erase()?Например:
Blah::iterator iter;
for ( iter = mm.begin();
iter != mm.end();
iter ++ )
{
if ( iter->second == something )
{
mm.erase( iter );
}
}
Следует ли ожидать, что это будет выполнено правильно, или итератор становится недействительным после вызова erase?Ссылочные сайты, такие как http://www.cplusplus.com/reference/stl/multimap/erase.html странно молчат на эту тему о продолжительности жизни итераторов или влиянии конструктивных / деструктивных методов на итераторы.
Решение
http://www.sgi.com/tech/stl/Multimap.html
Multimap has the important property that inserting a new element
into a multimap does not invalidate iterators that point to existing
elements. Erasing an element from a multimap also does not invalidate
any iterators, except, of course, for iterators that actually point to
the element that is being erased.
Итак, это должно выглядеть примерно так:
Blah::iterator iter;
for ( iter = mm.begin();iter != mm.end();)
{
if ( iter->second == something )
{
mm.erase( iter++ );
// Use post increment. This increments the iterator but
// returns a copy of the original iterator to be used by
// the erase method
}
else
{
++iter; // Use Pre Increment for efficiency.
}
}
Также смотрите:Что произойдет, если вы вызовете erase() для элемента карты во время итерации от начала до конца?
и
Другие советы
Стандарт C++ 23.1.2.8:
Элементы insert не должны влиять на действительность итераторов и ссылок на контейнер, а элементы erase должны делать недействительными только итераторы и ссылки на удаленные элементы.
Это общее требование для всех ассоциативных контейнеров, и std::multimap является одним из них.