c++ - 为什么 "!="与迭代器一起使用而不是 "<"?

标签 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.
}

我找到 iterator != foo.end()令人反感。如果 iterator 也可能很危险增加超过一。

使用 iterator < foo.end() 似乎更“正确” ,但我从未在实际代码中看到过。为什么不呢?

最佳答案

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

因此,使用 != 进行比较比使用 < 的比较更通用和灵活.


迭代器有不同的类别,因为并非所有元素范围都具有相同的访问属性。例如,

  • 如果你有一个指向数组(连续的元素序列)的迭代器,那么对它们进行关系比较就很简单了;您只需要比较指向元素的索引(或指向它们的指针,因为迭代器可能只包含指向元素的指针);

  • 如果你有一个链表中的迭代器,并且你想测试一个迭代器是否“小于”另一个迭代器,你必须从一个迭代器遍历链表的节点,直到你到达另一个迭代器迭代器,或者你到达列表的末尾。

规则是迭代器上的所有操作都应该具有恒定的时间复杂度(或者,至少是次线性时间复杂度)。您始终可以在恒定时间内执行相等比较,因为您只需要比较迭代器是否指向同一个对象。所以,所有的迭代器都是相等可比的。


此外,不允许将迭代器递增到其指向的范围的末尾。因此,如果您最终遇到 it != foo.end()不做与 it < foo.end() 相同的事情,您已经有未定义的行为,因为您已经迭代超过了范围的末尾。

指向数组的指针也是如此:不允许将指针递增到超出数组末尾的位置;这样做的程序表现出未定义的行为。 (对于索引显然不是这样,因为索引只是整数。)

一些标准库实现(如 Visual C++ 标准库实现)具有有用的调试代码,当您使用这样的迭代器执行非法操作时会引发断言。

关于c++ - 为什么 "!="与迭代器一起使用而不是 "<"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6673762/

相关文章:

java - 在多线程程序中使用迭代器时出现并发修改异常

java - 为数组列表实现迭代器

c++ - Cpp/Gdb 返回 0;导致所有用户的 session 注销

c++ - 完美转发

C++ "group where"算法

c++ - 如何从函数返回 vector 对象?

java - 如何从java中的对象列表中提取数组

c++ - 无法通过 C++ 警告 : (& crash after) deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]

c++ - 为什么在C++中调用d1=d2+d3语句的拷贝构造函数?

c++ - 使用 STL 映射时,模板参数的数量错误?