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

C++ vector::end()是否保证大于vector中任何对象的存储地址?,c++,vector,C++,Vector,在Internet上找到的默认迭代器循环如下所示: for(vector<int>::iterator it=myVector.begin(); it!=myVector.end(); it++) 那么它不是指向向量中的元素吗?我可以用为什么=,而不是=?保证结束迭代器的比较大于它不等于的任何有效迭代器。为什么=,而不是=?保证结束迭代器的比较大于它不等于的任何有效迭代器。在向量上定义的唯一迭代器是指向其元素之一的迭代器和结束迭代器。任何迭代器“大于”端都是未定义的。因此,尽管您的

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

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

那么它不是指向向量中的元素吗?我可以用
为什么
=
,而不是
=
?保证结束迭代器的比较大于它不等于的任何有效迭代器。

为什么
=
,而不是
=
?保证结束迭代器的比较大于它不等于的任何有效迭代器。

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

如果您想检查元素是在这个向量中还是在另一个向量中,那么
=
也帮不了您,因为比较这些迭代器是未定义的,通常会归结为指针比较,因此结果取决于哪个向量的地址较低

总之,在这里使用
=
毫无意义,因此应该避免

正如您的注释所述,您希望遍历向量的每个
n
-th元素。有多种方法可以以规定的方式实现这一点,例如:

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

如果您想检查元素是在这个向量中还是在另一个向量中,那么
=
也帮不了您,因为比较这些迭代器是未定义的,通常会归结为指针比较,因此结果取决于哪个向量的地址较低

总之,在这里使用
=
毫无意义,因此应该避免

正如您的注释所述,您希望遍历向量的每个
n
-th元素。有多种方法可以以规定的方式实现这一点,例如:

(it - vec.begin()) + n < vec.size()
(it-vec.begin())+n
无论是否是特定于编译器的,我认为这不是一个好主意。你到底想做什么?我在想,例如,遍历向量的每三个元素(it+3),但我担心如果我使用不同的编译器(it+3)可能不是end(),但也不是有效的条目,这种行为就会爆发。
=
是为随机访问迭代器定义的,这就是向量提供的。但是1)它不添加任何内容,2)它不能与具有其他迭代器类型(例如列表、集合或映射)的容器一起使用。即使迭代器恰好是简单的指针,它也有可能中断—例如,如果在您的系统上,向量放在内存段的末尾附近,超过
end
的指针可能会回绕到该段中的地址0。无论是否特定于编译器,我认为这都不是一个好主意。你到底想做什么?我在想,例如,遍历向量的每三个元素(it+3),但我担心如果我使用不同的编译器(it+3)可能不是end(),但也不是有效的条目,这种行为就会爆发。
=
是为随机访问迭代器定义的,这就是向量提供的。但是1)它不添加任何内容,2)它不能与具有其他迭代器类型(例如列表、集合或映射)的容器一起使用。即使迭代器恰好是简单的指针,它也有可能中断—例如,如果在您的系统上,向量放在内存段的末尾附近,超过
end
的指针可能会回绕到该段中的地址0。好的,谢谢,我不会这样做。我可能对“向量容器中的结束元素”的当前含义有太多的物理和有序的理解。@Blutkoete:检查我的最后一段,作为一个示例,如何在没有未定义行为的情况下跳过向量。TBH对于(size\u t I=0;I对于跨步,您也可以执行
it+=std::min)更简单的解决方案是
(stride,v.end()-it)
。好的,谢谢,我不会那么做。我可能对“向量容器中的结束元素”的当前含义有太多的物理和有序的理解。@Blutkoete:以我的最后一段为例,看看如何在没有未定义行为的情况下跳过向量。TBH更简单的解决方案是
(size_t i=0;i对于跨步,你也可以做
it+=std::min(stride,v.end()-it)
。我假设是因为他希望
it+=3
循环也能处理10个元素的向量,选择
[0]、[3]、[6]、[9]
,但不存在的
[12]
。我假设,因为他希望
it+=3
循环也能处理包含10个元素的向量,选择
[0]、[3]、[6]、[9]
,但不选择不存在的
[12]