【发布时间】:2011-10-04 03:56:34
【问题描述】:
我习惯这样写循环:
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.
}
我发现iterator != foo.end() 令人反感。如果iterator 增加超过一,也可能很危险。
使用iterator < foo.end() 似乎更“正确”,但我从未在实际代码中看到过。为什么不呢?
【问题讨论】:
-
使用
Iterator <= Foo.End()是不正确的。我想你的意思是Iterator < Foo.End()。 -
It can also be dangerous if Iterator is incremented by more than one.end,你已经有未定义的行为。 -
@Maxpm,在 STL 集合中,
end()是序列最后一个对象之后的一个元素。取消引用不是一件有效的事情。这也是为什么您可以安全地使用iter != sequence.end()而不必担心错过序列的最后一个对象的原因。 -
@Maxpm:我根本不是在谈论取消引用。 增加任何超过
end的迭代器是未定义的行为,无论您是否取消引用它。 -
@Maxpm:哪个容器?对于链表来说这很简单,例如,迭代器内只有一个空指针,而不是指向节点的有效指针。对于向量,只在内部分配的数组末尾之后就可以了。
标签: c++ stl iterator comparison-operators