如果vector改变,迭代器是否指向相同的元素?或者怎么做
Do iterators point to the same element if the vector changes? Or how to do that?
假设我有一个std::vector<int> v
,里面填充了一些数字:
{0, 1, 2, 3}
现在,假设我有一个迭代器指向数字2
和v.begin()+2
,并将其保存在一个变量中。此时,如果我在1和2之间插入另一个数字,向量就会变成
{0, 1, 4, 2, 3}
我的迭代器仍然指向2(它已经向前移动了一个单元格)还是指向新的数字(4)?如果是这样,是否有可能得到一个指针跟随它的元素,如果它被移动?
编辑:好吧,我的第一个问题可能有答案,但我不明白为什么它被标记为重复,因为我也问了别的问题…
查看各种容器的文档;它们指定函数如何使迭代器失效。
http://en.cppreference.com/w/cpp/container/vector
std::vector::insert
如果新的size()大于旧的capacity(),则导致重新分配。如果新的size()大于capacity(),则所有迭代器和引用都无效。否则,只有插入点之前的迭代器和引用仍然有效。过末端迭代器也失效。
保证不会发生重新分配,如果capacity()
大于或等于新的大小(因此您可以使用reserve
来实现这一点)。
如果你需要迭代器永远不会失效并跟随你的元素,你可以考虑使用std::list
(然而它具有完全不同的复杂性特征);这是否可以接受取决于您实际如何使用您的vector
。
如果不使用迭代器的原因多于使用迭代器的原因,则不使用迭代器
在某些容器中,迭代器是必需的,并且/或更好地完成它们的常规任务。std::vector
不是这样的容器。在std::vector
中,迭代器的主要用途是保留以后更改容器类型的能力(实际上您几乎不会使用这种能力)。
如果你真的关心x86-64性能和你真的真的确定超过4G元素的容器大小是荒谬的,使用索引类型(unsigned
)。如果你没有考虑太多,可以使用std::size_t
。不要犯初学者使用int
的错误。
从0到size()-1
的索引比从begin()
到end()-1
的迭代器更适合您的指定需求。不要让风格习惯强迫你编写糟糕的代码。
使用std::vector和索引,您可以获得比使用迭代器更健壮的行为,并且可以更容易地理解期望的行为。这显然不是你喜欢的行为。因此,你需要决定你是否可以忍受你所得到的行为,或者你是否需要一个不同的容器。
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用strcpy将char数组的元素复制到另一个数组
- 使用不带参数的函数访问结构元素
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- C++如何通过用户输入删除列表元素
- lower_bound()返回最后一个元素
- 基于多个条件处理地图中的所有元素
- 调整大小后指向元素值的指针unordered_map有效?
- 使用std::transform将一个范围的元素添加到另一个范围中
- 使用函数"remove"删除重复元素
- 具有最大子序列大小的序列,每个元素都相同
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何将元素添加到数组的线程安全函数?
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- 我想访问std::unique_ptr中的一个特定元素
- 我可以让 std::list 按顺序插入新元素吗?或者必须使用std::sort
- 如果vector改变,迭代器是否指向相同的元素?或者怎么做
- 获取unordered_set中最右边的元素(或者反向打印内容)
- 最好强制转换列表中的一个元素,或者使用指向它的指针