STD :: Multimap <>에서 항목이 삭제 된 후 반복자를 계속 사용할 수 있습니까? [복제하다

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

  •  22-07-2019
  •  | 
  •  

문제

Multimap :: Erase ()를 호출 한 후에도 멀티 맵 반복기를 계속 사용할 수 있습니까? 예를 들어:

Blah::iterator iter;
for ( iter = mm.begin();
      iter != mm.end();
      iter ++ )
{
    if ( iter->second == something )
    {
        mm.erase( iter );
    }
}

이것은 올바르게 실행될 것으로 예상됩니까, 아니면 지우기를 요청한 후 반복자가 무효화되어 있습니까? 참조 사이트가 좋아요 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 :

삽입 멤버는 반복자의 유효성과 컨테이너에 대한 참조에 영향을 미치지 않으며, 지우기 멤버는 반복자 만 무효화하고 지우는 요소에 대한 참조를 무효화해야합니다.

이것은 모든 연관 컨테이너에 대한 일반적인 요구 사항이며 std :: 멀티 맵이 그 중 하나입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top