C++ “为什么是”=&引用;与迭代器一起使用,而不是“0”<&引用;?

C++ “为什么是”=&引用;与迭代器一起使用,而不是“0”<&引用;?,c++,stl,iterator,comparison-operators,C++,Stl,Iterator,Comparison Operators,我习惯于这样写循环: for (std::size_t index = 0; index < foo.size(); index++) { // Do stuff with foo[index]. } for (Foo::Iterator iterator = foo.begin(); iterator != foo.end(); iterator++) { // Do stuff with *Iterator. } 我找到了迭代器!=foo.end()。如果迭代器的增

我习惯于这样写循环:

for (std::size_t index = 0; index < foo.size(); index++)
{
    // Do stuff with foo[index].
}
for (Foo::Iterator iterator = foo.begin(); iterator != foo.end(); iterator++)
{
    // Do stuff with *Iterator.
}
我找到了
迭代器!=foo.end()。如果
迭代器
的增量超过一,则也可能是危险的


使用
迭代器所有迭代器都是相等的。只有随机访问迭代器在关系上是可比较的。输入迭代器、前向迭代器和双向迭代器在关系上是不可比较的


因此,使用
进行比较=比使用
的比较更通用、更灵活:因为
迭代器
不是一个数字,而是一个对象

更详细的回答:集合比线性数组多。例如,树和散列实际上并不适合“这个索引在另一个索引之前”。例如,对于一棵树,两个索引位于不同的分支上。或者,散列中的任意两个索引——它们根本没有顺序,因此对它们施加的任何顺序都是任意的


您不必担心“丢失”
End()
。它也不是一个数字,而是一个表示集合结束的对象。让迭代器通过它是没有意义的,事实上它不能;作为支持这一答案的一个具体例子,很难实现
操作,你也可能是指
it
而不是
it@zneak:噢,是的。非常感谢。此外,不允许迭代器的增量超过它所指向的范围的末尾。所以,如果你最终陷入这样一个场景foo.end()与迭代器
是不正确的。如果迭代器的增量超过一,则也可能是危险的。
@Maxpm,在STL集合中,
end()
是序列最后一个对象之后的一个元素。取消引用是无效的。这也是为什么您可以安全地使用iter!=sequence.end()
不必担心丢失序列的最后一个对象。@Maxpm:我根本不是说取消引用。无论是否取消引用,将任何迭代器的值递增到
end
之前都是未定义的行为。@Maxpm:哪个容器?例如,对于一个链表来说,在迭代器中只有一个空指针,而不是一个指向节点的有效指针,这很简单。对于一个向量,只要在内部分配的数组的末尾加上一个就可以了。但是,如果一个结构的元素不能表示为彼此之间的“之前”或“之后”,那么为它设置一个迭代器是否有意义呢?毕竟,您将无法执行
迭代器+++
,迭代器的全部功能是迭代。@Maxpm,迭代器对于枚举对象也很有用。作为一个具体的例子,您无法根据自己的喜好固定
std::set
中元素的顺序,但它仍然是可执行的。而且,这并不是说不可能区分哪种元素排在第一位;更确切地说,所需的复杂度可能比预期的要高(使用树示例,判断哪个节点首先出现的最坏情况要比一些比较糟糕得多);因此,最好不要实现该功能,让用户陷入一个糟糕的性能陷阱。@Maxpm,当然,每个集合都有一个物理顺序,这是在非量子计算机的有限空间中表示的必要条件。但是,该顺序是完全任意的,并且不一定与集合的逻辑顺序相关(如果它有逻辑顺序的话)。所以,即使你可以迭代(通过物理顺序),这个顺序也不一定有意义。这个答案是错误的@zneak是对的,问题不是没有实现
操作符的合理方法