【问题标题】:Types of iterator : Output vs. Input vs. Forward vs. Random Access Iterator迭代器的类型:输出与输入与前向与随机访问迭代器
【发布时间】:2011-07-09 20:59:29
【问题描述】:

C++ STL 中有多少种迭代器?到目前为止,我知道这些:

  • 输出迭代器
  • 输入迭代器
  • 前向迭代器
  • 随机访问迭代器

还有更多吗?它们之间有什么区别?各自的局限和特点是什么?什么时候用什么类型?

【问题讨论】:

    标签: c++ stl iterator


    【解决方案1】:

    如果可以,请查找并阅读“C++ 标准库:教程和参考”。本书包含一整章关于 STL 迭代器的内容。

    这是书中的一些内容:

    Iterator Category  Ability                          Providers
    -----------------  -------------------------------  ----------------------------
    Input iterator     Reads forward                    istream
    Output iterator    Writes forward                   ostream, inserter
    Forward iterator   Reads/writes forward             forward_list,
                                                          unordered_[multi]set,
                                                          unordered_[multi]map
    Bidirectional it.  Reads/writes forward/backward    list, [multi]set, [multi]map
    Random access it.  Reads/writes with random access  vector, deque string, array 
    

    【讨论】:

    • 这已经过时了,因为它缺少 C++11 的信息,但是唯一相关的变化是现在有提供前向迭代器的容器:forward_listunordered_setunordered_multisetunordered_mapunordered_multimap
    • @Jules 这怎么过时了?由于在 C++11 中没有引入新的迭代器,并且旧迭代器的行为没有改变,我会说它非常准确。哪些容器支持哪些迭代器与问题无关。
    • 也许该问题并未具体提出,但该信息已包含在答案中,因此在该信息发生更改时发表评论是合适的。
    • “C++ 标准库:教程和参考”第 2 版包括对 C++11 的支持。总的来说,这本书的参考对我作为 STL 的学生很有用。
    • 我们在 C++17 中有连续的迭代器。我们在 C++20 中有 contiguous_iterator_tag
    【解决方案2】:

    C++ 标准也有一个双向迭代器的概念,它是一个向前迭代器,也可以向后(operator--)。这五个共同构成了 C++ 标准第 24.2 段中的整个迭代器层次结构。

    旧的 STL 也有 Trivial Iterator 的概念。有关各种迭代器的详细信息,请参阅其Iterator overview

    Boost 设计师 Abrahams、Siek 和 Witt 拥有 presented 一组更细粒度的迭代器概念。

    【讨论】:

    • 投反对票,因为这仅回答了有关这些类型的 4 个问题中的第一个。 @zkunov 的答案要好得多,IMO,尽管缺乏有关旧版本/提升的附加信息。
    • @Jules 不幸的是,这个答案被接受了,但投票否决它实际上并不会在答案中排名较低。
    • @Jules 我不确定 boost 迭代器与这个问题有什么关系,因为 OP 询问了 stl / std 迭代器。
    【解决方案3】:

    我怀疑你很清楚答案,但无论如何,these charts 对解决这个问题很有帮助

    【讨论】:

      猜你喜欢
      • 2022-11-14
      • 2012-10-27
      • 2017-09-02
      • 2012-12-13
      • 2010-10-27
      • 2016-10-22
      • 2013-02-07
      • 2018-05-24
      • 2019-12-06
      相关资源
      最近更新 更多