c – 为什么“!=”与迭代器而不是“<”一起使用?
我习惯写这样的循环:
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<似乎更“正确”. foo.end(),但我从未在实际代码中看到过.为什么不? 解决方法
所有迭代器都是可比较的.只有随机访问迭代器才具有可比性.输入迭代器,前向迭代器和双向迭代器在关系上不具有可比性.
因此,使用!=的比较比使用<的比较更通用和灵活. 有不同类别的迭代器,因为并非所有元素范围都具有相同的访问属性.例如, 规则是迭代器上的所有操作都应该具有恒定的时间复杂度(或者至少是次线性时间复杂度).您始终可以在常量时间内执行相等比较,因为您只需要比较迭代器是否指向同一个对象.因此,所有迭代器都具有可比性. 此外,不允许将迭代器增加到它指向的范围的末尾.所以,如果你最终遇到它的情况!= foo.end()不会做同样的事情< foo.end(),你已经有了未定义的行为,因为你已经遍历了范围的末尾. 对于指向数组的指针也是如此:不允许将指针递增到数组的末尾之外;这样做的程序展示了未定义的行为. (对于指数来说,情况显然不同,因为指数只是整数.) 一些标准库实现(如Visual C标准库实现)具有有用的调试代码,当您使用像这样的迭代器执行非法操作时会引发断言. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |