当ptr_vector迭代器失效时
When ptr_vector iterators are invalidated
插入
和/或删除元素是否有可能使现有元素的迭代器无效。
谢谢。
是的。boost::ptr_vector<T>
的文档指出:
ptr_vector<T>
是使用基础std::vector<void*>
存储指针的指针容器。
在std::vector
中插入元素或从中删除元素可能会导致重新分配,从而使现有迭代器失效。
具体来说,C++11 的 §23.3.6.5/3 规定了关于erase()
:
(3( 效果:在擦除点或之后使迭代器和引用失效。
关于insert()
和push_back()
:
(1( 备注:当新容量大于旧容量时,会导致重新分配。如果未发生重新分配,则插入点之前的所有迭代器和引用仍然有效。
因此,为了防止在元素插入的情况下迭代器失效,您可以使用 reserve()
函数在从向量获取任何迭代器之前增加向量的容量。然后,这些迭代器将保持有效,直到向量的size()
超过为空间保留的元素数。
相关文章:
- 不明白迭代器,引用和指针失效,一个例子
- std::vector::erase() 真的会在擦除时使迭代器失效吗?
- 没有迭代器失效是否意味着推进迭代器的有效性?
- C++11 std::列出拼接后的迭代器失效
- 为什么输入迭代器在递增后会使自身失效?
- C++ std::map 和 std::set 擦除复制值,从而使迭代器失效
- 当没有迭代器失效时,这是否包括结束迭代器?
- 为什么在擦除位置之前的矢量的 c++ 迭代器在 Visual Studio 中也失效
- std::map 线程安全和迭代器失效
- 为什么 std::vector 迭代器在 erase() 调用后失效?
- 避免迭代器在向量迭代过程中失效
- 赋值(运算符 =)使容器的迭代器失效
- 递增可变输入迭代器是否会使旧迭代器值失效
- std::list<>::splice 使迭代器失效。理由?
- C++11 中的过去终结迭代器失效
- 在字符串中使用 erase 函数是否会使迭代器失效
- tbb::concurrent_unordered_map::unsafe_erase 是否会使任何现有迭代器失效
- 迭代器与指针(引用)的双插入失效
- 为什么 vector::迭代器在重新分配时失效
- 迭代器失效 - end() 是否算作迭代器