当前位置 : 主页 > 编程语言 > c++ >

c – 为什么“!=”与迭代器而不是“<”一起使用?

来源:互联网 收集:自由互联 发布时间:2021-06-23
我习惯写这样的循环: for (std::size_t index = 0; index foo.size(); index++){ // Do stuff with foo[index].} 但是当我在其他代码中看到迭代器循环时,它们看起来像这样: for (Foo::Iterator iterator = foo.begin(
我习惯写这样的循环:

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标准库实现)具有有用的调试代码,当您使用像这样的迭代器执行非法操作时会引发断言.

网友评论