如果向量发生变化,迭代器是否指向相同的元素?或者怎么做?

时间:2015-10-09 14:00:08

标签: c++ vector iterator

我们说我有一个std::vector<int> v,里面装满了一些数字:

{0, 1, 2, 3}

现在,让我们说我得到一个迭代器,指向带有2的数字v.begin()+2并将其保存在变量中。此时如果我在1和2之间插入另一个数字,我的矢量看起来像

{0, 1, 4, 2, 3}

我的迭代器是否仍然指向2(向前移动了一个单元格)或它指向新的数字(4)?如果是这样,是否可以获得一个跟随其元素的指针,如果它被移动了?

编辑:

好的,我的第一个问题可能有答案,但我不明白为什么它被标记为重复,因为我也问了别的......

3 个答案:

答案 0 :(得分:4)

查看各种容器的文档;它们指定函数如何使迭代器失效。

http://en.cppreference.com/w/cpp/container/vector

  

std::vector::insert   如果新size()大于旧容量(),则会导致重新分配。如果new size()大于capacity(),则所有迭代器和引用都将失效。否则,只有插入点之前的迭代器和引用仍然有效。过去的迭代器也无效。

答案 1 :(得分:2)

只要没有重新分配就可以保证,如果capacity()大于或等于新大小,那么就是这种情况(所以你可以使用reserve来实现)。

如果您需要迭代器永远不会失效并遵循您的元素,您可以考虑使用std::list(但具有完全不同的复杂性特征);这是否可以接受取决于您实际使用vector的方式。

答案 2 :(得分:0)

如果不使用迭代器的原因超过使用迭代器的原因,那么不要使用迭代器

有些容器需要迭代器和/或更好的通常任务。 std::vector不是这样的容器。 std::vector中迭代器的主要用途是保留稍后就容器类型改变主意的能力(你几乎从未实际使用过)。

使用索引(unsigned类型如果真的关心x86-64性能 真的非常肯定容器大小超过4G元素是荒谬的。如果你没有多想,请使用std::size_t。不要让初学者误以为使用int)。

从0到size()-1的索引比从begin()end()-1的迭代器更适合您指定的要求。不要让风格习惯强迫你编写糟糕的代码。

使用std :: vector和索引,您可以获得比使用迭代器更强大的行为,并且您可以更轻松地了解所期望的行为。它仍然不是你显然更喜欢的行为。为此,您需要决定是否可以接受您获得的行为或是否需要不同的容器。