This question already has answers here:
Iterator invalidation rules
(6个答案)
2年前关闭。
使用擦除方法时,迭代器何时以及如何使映射无效?
例如 :
被擦除的迭代器肯定会变得无效(在仍然有效时会递增)
但是其他人呢?
如果我没记错的话,标准说映射必须是平衡的二叉树或具有等效键搜索复杂性的结构
如果 map 是用树实现的,我可以假定未擦除的迭代器仍然有效吗?
实现 map 的其他可能方式又如何呢?
(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