STD :: Multimap <>에서 항목이 삭제 된 후 반복자를 계속 사용할 수 있습니까? [복제하다
문제
이 질문은 이미 여기에 답이 있습니다.
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 :: 멀티 맵이 그 중 하나입니다.
제휴하지 않습니다 StackOverflow