【问题标题】:Why is std::vector::iterator not contiguous iterator?为什么 std::vector::iterator 不是连续迭代器?
【发布时间】:2020-07-23 04:08:26
【问题描述】:

根据std::vectorcppref page

iterator LegacyRandomAccessIterator

同样来自另一个cppref page

以下标准库类型是LegacyContiguousIterators

vector::iterator 用于 bool 以外的 value_type。

哪个是正确的?

【问题讨论】:

  • 两者都是正确的。不要理会窗帘后面的人。一是一厢情愿。另一个是冰冷、坚硬、现实。
  • @SamVarshavchik 嗯?
  • 嗯,@Quentin?您从未听说过std::vector<bool>,以及它的所有魅力吗?它造成了什么混乱,现在持续了几十年?好吧,你要请客了。只需从 www.google.com 开始,然后继续阅读...
  • @SamVarshavchik 我有,但那句话(?)就在我头上:D

标签: c++ iterator typetraits c++20 c++-concepts


【解决方案1】:

两者都是正确的。所有向量迭代器都是随机访问迭代器。除了 bool 的 vector 之外,所有的向量迭代器都是连续的迭代器。请注意,所有连续迭代器也是随机访问迭代器。

前一个声明根本没有提供尽可能多的信息,并且可能没有更新,因为 c++17 的更改引入了连续迭代器要求的名称。

【讨论】:

    【解决方案2】:

    std::vector<T>::iterator(对于T,而不是bool一个连续的迭代器。

    [vector.overview]/2:

    vector 满足容器的所有要求,并且 [...] 满足连续容器的 bool 以外的元素类型的所有要求。

    [container.requirements.general]/13(强调我的):

    连续容器是其成员类型 iterator 和 const_iterator 满足 Cpp17RandomAccessIterator 要求 ([random.access.iterators]) 和 model contiguous_iterator ([iterator.concept.contiguous]) 的容器。


    根据std::vectorcppref page

    iterator LegacyRandomAccessIterator

    这并不意味着迭代器不是连续的迭代器。它甚至没有谈论连续迭代器。

    同一页面还提到:

    std::vector(对于T,而不是bool)符合[...] ContiguousContainer [...]的要求。

    the page of ContiguousContainer 说:

    类型X满足ContiguousContainer if

    • [...]
    • 成员类型X::iteratorX::const_iteratorLegacyContiguousIterators

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-31
      • 1970-01-01
      • 2016-04-21
      相关资源
      最近更新 更多