我习惯这样写循环:
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()
,但我从未在实际代码中看到过这一点。为什么不?
所有迭代器都是相等可比较的。只有随机访问迭代器具有相关可比性。输入迭代器、正向迭代器和双向迭代器没有相关可比性。
因此,使用比较!=
比使用的比较更通用和灵活<
.
迭代器有不同的类别,因为并非所有元素范围都具有相同的访问属性。例如,
规则是迭代器上的所有操作都应具有恒定的时间复杂度(或者至少具有亚线性时间复杂度)。您始终可以在恒定时间内执行相等比较,因为您只需比较迭代器是否指向同一对象。因此,所有迭代器都是相等可比较的。
此外,不允许将迭代器递增到超过其所指向范围的末尾。所以,如果你最终遇到这样的情况it != foo.end()
不做同样的事情it < foo.end()
,您已经有未定义的行为,因为您已经迭代到了范围的末尾。
对于指向数组的指针也是如此:不允许将指针增加到超出数组末尾一位;这样做的程序会表现出未定义的行为。 (对于索引来说显然不是这样,因为索引只是整数。)
某些标准库实现(例如 Visual C++ 标准库实现)具有有用的调试代码,当您使用这样的迭代器执行非法操作时,这些代码将引发断言。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)