vector :: end()是否保证大于向量中任何对象的存储地址?

时间:2014-07-28 08:38:15

标签: c++ vector

您在Internet上找到的默认迭代器循环如下所示:

for(vector<int>::iterator it=myVector.begin(); it!=myVector.end(); it++)

现在我想用迭代器尝试一些更奇特的东西。我正在考虑经历向量的每个第三个元素(it + 3作为递增函数),但我担心如果我使用不同的编译器或不同的数据集,it + 3可能不等于{{1},则此行为会爆炸但同时也没有指出有效的东西。

所以我想知道如果

总是如此
vector::end()

然后它没有指向我的向量中的元素?我可以使用it >= myVector.end() 而不是<并确保我不会遇到特定于编译器实现的问题吗?

非常感谢!

2 个答案:

答案 0 :(得分:5)

在向量上定义的唯一迭代器是指向其元素结束迭代器之一的迭代器。无论如何,任何迭代器“大于”结束都是未定义的。因此,尽管您的比较可能有效,但它不会添加任何值,因为添加的>只会与未定义的迭代器进行比较时产生差异。由于使用未定义的迭代器意味着未定义的行为,所以你永远不会想要这样的迭代器。此外,这也回答了您的问题:与未定义的迭代器进行比较当然也是未定义的,因此无法保证产生有意义的结果。

如果你想检查一个元素是在这个向量中还是在另一个向量中,那么>=对你来说也没有帮助,因为比较这些迭代器是未定义的,通常会归结为指针比较,所以结果取决于哪个矢量具有较低的地址。

总而言之,在这里使用>=根本没有意义,因此应该避免使用。

正如您的评论所述,您希望遍历向量的每个n个元素。有各种方法以定义的方式执行此操作,例如:

(it - vec.begin()) + n < vec.size()

答案 1 :(得分:1)

为什么>=代替==?保证结束迭代器比任何有效的迭代器都要大,它不等于。