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

Does std::vector::erase() invalidate the iterator at the point of erase?

本文关键字:擦除 迭代器 无效 是否 vector erase std      更新时间:2023-10-16

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

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

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

vec.erase(vec.begin())

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

迭代器会在擦除点之后的或在擦除点之后(包括该点)的>失效吗?

我想说,您擦除向量中唯一元素的示例表明,插入点处的迭代器必须无效。

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

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

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

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

事实上,这可能取决于实施情况。然而,我认为懒惰的增长/收缩数组是最适合vector::erase()的实现。[因为它可能取决于实现,所以不要指望像invalid…]

这样的东西