std :: vector :: erase()是否在擦除时使迭代器无效?

时间:2014-09-16 11:54:51

标签: c++ vector erase c++03

C ++ 03标准§23.2.4.3/3描述了std::vector::erase(iterator position)并具体说明了

  

在擦除点之后使所有迭代器和引用无效。

中的迭代器是否擦除无效?具体来说,如果我有一个vector只有一个元素,我将begin()迭代器复制到一个局部变量然后调用

vec.erase(vec.begin())

我在局部变量中的迭代器是否会失效?

擦除点之后是否会使迭代器失效,在擦除点之后包括

2 个答案:

答案 0 :(得分:8)

我要说你擦除向量中唯一元素的例子表明插入点的迭代器必须无效。

无论如何,在C ++ 11中,措辞已经改变(23.3.6.5/3):

  

效果:在擦除点或之后使迭代器和引用无效。

答案 1 :(得分:0)

vector::erase()的复杂性表示:删除的元素数量(destructions)加上最后一个元素删除(移动)后的元素数量。

在我看来,它是作为一个懒惰的增长/收缩数组实现的。迭代器,指向数据的指针,当擦除时,以下数据将被复制到其位置。因此,如果您擦除的数据不是最后一个数据,那么您保留的迭代器将指向其他数据。

实际上,它可能取决于实施。然而,我认为惰性增长/收缩数组是vector::erase()最适合的实现。 [由于它可能取决于实施,不要指望无效......]