Могу ли я продолжать использовать итератор после того, как элемент был удален из std::multimap<>?[дубликат]

StackOverflow https://stackoverflow.com/questions/446205

  •  22-07-2019
  •  | 
  •  

Вопрос

Могу ли я продолжать использовать итератор 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 является одним из них.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top