std::vector::erase()是否在擦除时使迭代器无效
Does std::vector::erase() invalidate the iterator at the point of erase?
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…]
相关文章:
- 调用 erase() 函数是否也会在擦除元素之前更改迭代器值?
- 如何使用 std::list 模板的迭代器擦除
- 在擦除或修改作为不同索引键的值时,boost::multi_index 迭代器是否无效?
- 如何使用擦除和迭代器来删除二维向量中的项目
- C++ 矢量擦除推进迭代器
- 编译错误 std::vector<std::shared_ptr<T>>迭代器和擦除方法
- std::vector::erase() 真的会在擦除时使迭代器失效吗?
- 列出超出范围的擦除迭代器
- std::map 擦除 - 将迭代器传递给错误的映射
- 为什么擦除-删除成语不适用于反向迭代器
- C++ 向量::使用类对象迭代器擦除不擦除向量成员
- 矢量::擦除不适用于反向迭代器吗?
- 向量模板类:擦除(迭代器开始,迭代器端)
- 在向量和映射上执行擦除(迭代器)时观察到的不同行为
- 如何不擦除迭代器(从"Effective STL")
- 范围外的矢量擦除迭代器
- 范围之外的矢量擦除迭代器
- 删除并擦除迭代器
- 迭代器擦除 (迭代器在先,迭代器最后) 在 Visual C++ 2010 Express 下不起作用
- 在stl集合中移除迭代器时出现分割错误