【问题标题】:std::vector iterator type and permissible operationsstd::vector 迭代器类型和允许的操作
【发布时间】:2018-07-24 12:45:34
【问题描述】:

C++ named requirements: ContiguousIterator 指代std::vector 的迭代器类型为连续的。但是没有为类型连续迭代器here提供定义。

std::vector::begin 将迭代器类型称为随机访问迭代器。

这是否意味着连续迭代器属于随机访问类型?

【问题讨论】:

    标签: c++ c++11 iterator c++17 contiguous


    【解决方案1】:

    CPRPReference 通过描绘 C++ 标准中未出现的迭代器类别和概念 ContiguousIterator 让您误入歧途。 C++17 将连续性定义为迭代器的属性,就像可变性一样。 [iterator.requirements.general]/6:

    进一步满足以下要求的迭代器:对于整数值n 和可解引用的迭代器值a(a + n)*(a + n) 等效于*(addressof(*a) + n),称为连续迭代器 .

    值得注意的是,此属性独立于迭代器类别。理论上,您可以定义一个满足连续迭代器要求和任何迭代器类别要求的迭代器。

    在实践中,我认为这种灵活性不会为连续迭代器是随机访问迭代器的改进的设计提供任何表现力。事实上,标准库容器要求将 contiguous container 定义为 ([container.requirements]/13):

    连续容器是支持随机访问迭代器的容器,其成员类型iteratorconst_­iterator是连续迭代器。

    这并不完全违背 [iterator.requirements.general]/6 的概念,即连续性独立于迭代器类别,但它确实引入了有助于引起混淆的不一致。

    【讨论】:

    • 我们已经组成了整套驼峰式迭代器概念(RandomAccessIterator 等)。我有点倾向于只是补充一些,并说ContiguousIterator 改进了 RAI。
    • @T.C.公平地说,我应该承认我只是提交了一个提案,以几乎完全采用这种设计,向 Ranges TS 添加对连续迭代器/范围的支持。我不知道 WG21 在决定将邻接与迭代器类别正交时在想什么。
    【解决方案2】:

    [a] 连续迭代器是随机访问类型的吗?

    是的。

    “连续迭代器”被定义为(参见N3884

    一个同时满足以下要求的随机访问迭代器:

    std::pointer_from(i) == std::addressof(*i)(当 i 可取消引用时)

    std::pointer_from(i + n) == std::pointer_from(i) + n(当i + n 是有效的迭代器时)

    所以

    • “连续迭代器”暗示“随机访问迭代器”

    • “随机访问迭代器”并不意味着“连续迭代器”(反例参见std::deque

    【讨论】:

      【解决方案3】:

      是的。 cppreference has a nice chart,这清楚地表明ContiguousIterator 包含RandomAccessIterator 的功能的超集(它本身是BidirectionalIterator 的超集,它是@​​987654325@ 的超集等)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-02
        • 2020-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-14
        • 2020-08-20
        • 1970-01-01
        相关资源
        最近更新 更多