【问题标题】:Why using != to compare iterator in loop condition为什么使用 != 在循环条件下比较迭代器
【发布时间】:2021-12-11 16:08:47
【问题描述】:

在许多关于迭代向量的示例中,我注意到不等于运算符通常用于检查循环是否已到达向量的末尾。通常,我在循环条件中使用低于运算符。因此,我想知道,选择!= 的理由是什么?

例子:

std::vector<int> vec = {1, 2, 3, 4, 5};
for (auto iter = vec.begin(); iter != vec.end(); iter++) {
  std::cout << *iter << " ";
}

【问题讨论】:

  • 所以基本上迭代器是指针,并不总是有序
  • &lt;std::list 的项目意味着什么?所有的迭代器都可以被问到“你到头了吗”,但并不是所有的迭代器都有“小于”的概念。

标签: c++ loops iterator


【解决方案1】:

因为并非所有迭代器都支持排序,但所有迭代器都可以在 O(1) 中进行相等性比较。

例如关联(有序)容器使用双向迭代器,定义为 (cppreference):

template<class I>
  concept bidirectional_iterator =
    std::forward_iterator<I> &&
    std::derived_from</*ITER_CONCEPT*/<I>, std::bidirectional_iterator_tag> &&
    requires(I i) {
      { --i } -> std::same_as<I&>;
      { i-- } -> std::same_as<I>;
    };

std::forward_iterator 只能取消引用、复制、== 和递增。

另一方面,std::vector 使用的随机访问迭代器需要std::totally_ordered&lt;I&gt;。所以在你的情况下你可以写iter &lt; vec.end();,但代码会变得不那么通用。只要不增加循环体​​中的迭代器,无论如何都是安全的。

【讨论】:

    【解决方案2】:

    据我了解,
    iterator 在 STL 内部有一个实现,使您能够“迭代”元素。使用它们,程序员不必编写逻辑来移动到下一个元素,具体取决于实现它的数据结构。

    也就是说,元素并不总是按顺序存储在内存中。因此,与索引相比,它们不能仅仅比较小于或大于。

    具体来说,对于向量,您可以选择在比较元素位置时使用索引。但对于其他 DS 来说,同样不能自信地说。

    因此,在您的问题中,迭代器的实现可以通过比较是否到达最后一个元素来跨越所有元素。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-25
      • 1970-01-01
      • 1970-01-01
      • 2017-09-18
      • 1970-01-01
      • 1970-01-01
      • 2020-09-01
      • 2021-09-07
      相关资源
      最近更新 更多