This question already has answers here:
Iterator invalidation rules

(6个答案)


2年前关闭。




使用擦除方法时,迭代器何时以及如何使映射无效?

例如 :
std :: map < int , int > aMap ;

aMap [ 33 ] = 1 ;
aMap [ 42 ] = 10000 ;
aMap [ 69 ] = 100 ;
aMap [ 666 ] = -1 ;

std :: map < int , int > :: iterator itEnd = aMap.lower_bound ( 50 ) ;

for ( std :: map < int , int > :: iterator it = aMap.begin ( ) ;
      it != itEnd ;
      // no-op
    )
{
   aMap.erase ( it ++ ) ;
}

被擦除的迭代器肯定会变得无效(在仍然有效时会递增)
但是其他人呢?

如果我没记错的话,标准说映射必须是平衡的二叉树或具有等效键搜索复杂性的结构

如果 map 是用树实现的,我可以假定未擦除的迭代器仍然有效吗?

实现 map 的其他可能方式又如何呢?

最佳答案

只有擦除的迭代器是无效的,其余的由标准保证仍然有效。

参见Iterator invalidation rules

10-05 22:01