如果vector改变,迭代器是否指向相同的元素?或者怎么做

Do iterators point to the same element if the vector changes? Or how to do that?

本文关键字:元素 或者 改变 vector 迭代器 是否 如果      更新时间:2023-10-16

假设我有一个std::vector<int> v,里面填充了一些数字:

{0, 1, 2, 3}

现在,假设我有一个迭代器指向数字2v.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和索引,您可以获得比使用迭代器更健壮的行为,并且可以更容易地理解期望的行为。这显然不是你喜欢的行为。因此,你需要决定你是否可以忍受你所得到的行为,或者你是否需要一个不同的容器。