C ++ 03标准§23.2.4.3/3描述了std::vector::erase(iterator position)
并具体说明了
在擦除点之后使所有迭代器和引用无效。
中的迭代器是否擦除无效?具体来说,如果我有一个vector
只有一个元素,我将begin()
迭代器复制到一个局部变量然后调用
vec.erase(vec.begin())
我在局部变量中的迭代器是否会失效?
在擦除点之后是否会使迭代器失效,在擦除点之后包括?
答案 0 :(得分:8)
我要说你擦除向量中唯一元素的例子表明插入点的迭代器必须无效。
无论如何,在C ++ 11中,措辞已经改变(23.3.6.5/3):
效果:在擦除点或之后使迭代器和引用无效。
答案 1 :(得分:0)
vector::erase()
的复杂性表示:删除的元素数量(destructions)加上最后一个元素删除(移动)后的元素数量。
在我看来,它是作为一个懒惰的增长/收缩数组实现的。迭代器,指向数据的指针,当擦除时,以下数据将被复制到其位置。因此,如果您擦除的数据不是最后一个数据,那么您保留的迭代器将指向其他数据。
实际上,它可能取决于实施。然而,我认为惰性增长/收缩数组是vector::erase()
最适合的实现。 [由于它可能取决于实施,不要指望无效......]