使用擦除方法时,地图中的迭代器何时以及如何失效?
例如:
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 ++ ) ;
}
擦除的迭代器肯定会变为无效(它在增加时仍然有效) 但其他人呢?
如果我没错,标准说地图必须是平衡的二叉树或具有等效密钥搜索复杂性的结构
如果地图是用树实现的,我可以假设没有擦除的迭代器仍然有效吗?
实现地图的其他可能方法呢?
答案 0 :(得分:8)
只有擦除的迭代器无效,其余部分由标准保证保持有效。
答案 1 :(得分:1)
如果要将地图实现为平衡树,则在执行擦除之后,树可能需要重新平衡,这意味着迭代器指向的位置,现在可能有其他东西或没有其他东西,具体取决于树的重新平衡,这就是为什么当你从地图中删除一个元素时,迭代器被无效,擦除了元素,迭代器现在最终指向一些不再有效的内存,这是未定义的行为。
如果您决定从地图中删除所有元素,在循环内部,那么迭代器将会指向哪个?