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

Blu*_*ete 1 c++ vector

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

for(vector<int>::iterator it=myVector.begin(); it!=myVector.end(); it++)
Run Code Online (Sandbox Code Playgroud)

现在我想用迭代器尝试一些更奇特的东西.我正在考虑运行例如向量的每个第三个元素(it + 3作为增量函数),但我担心如果我使用不同的编译器或不同的数据集,这种行为会爆炸,但it + 3可能不同vector::end(),但同时也没有指出有效的东西.

所以我想知道是否总是如此

it >= myVector.end()
Run Code Online (Sandbox Code Playgroud)

然后它没有指向我的向量中的元素?我可以使用<而不是!=安全的,我不会遇到特定于编译器实现的问题吗?

非常感谢你!

gex*_*ide 5

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

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

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

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

(it - vec.begin()) + n < vec.size()
Run Code Online (Sandbox Code Playgroud)