您在Internet上找到的默认迭代器循环如下所示:
for(vector<int>::iterator it=myVector.begin(); it!=myVector.end(); it++)
现在我想用迭代器尝试一些更奇特的东西。我正在考虑经历向量的每个第三个元素(it + 3
作为递增函数),但我担心如果我使用不同的编译器或不同的数据集,it + 3
可能不等于{{1},则此行为会爆炸但同时也没有指出有效的东西。
所以我想知道如果
总是如此vector::end()
然后它没有指向我的向量中的元素?我可以使用it >= myVector.end()
而不是<
并确保我不会遇到特定于编译器实现的问题吗?
非常感谢!
答案 0 :(得分:5)
在向量上定义的唯一迭代器是指向其元素和结束迭代器之一的迭代器。无论如何,任何迭代器“大于”结束都是未定义的。因此,尽管您的比较可能有效,但它不会添加任何值,因为添加的>
只会与未定义的迭代器进行比较时产生差异。由于使用未定义的迭代器意味着未定义的行为,所以你永远不会想要这样的迭代器。此外,这也回答了您的问题:与未定义的迭代器进行比较当然也是未定义的,因此无法保证产生有意义的结果。
如果你想检查一个元素是在这个向量中还是在另一个向量中,那么>=
对你来说也没有帮助,因为比较这些迭代器是未定义的,通常会归结为指针比较,所以结果取决于哪个矢量具有较低的地址。
总而言之,在这里使用>=
根本没有意义,因此应该避免使用。
正如您的评论所述,您希望遍历向量的每个n
个元素。有各种方法以定义的方式执行此操作,例如:
(it - vec.begin()) + n < vec.size()
答案 1 :(得分:1)
为什么>=
代替==
?保证结束迭代器比任何有效的迭代器都要大,它不等于。