代码之家  ›  专栏  ›  技术社区  ›  user9196120

std::向量迭代器类型和允许的操作

  •  1
  • user9196120  · 技术社区  · 6 年前

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

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

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

    3 回复  |  直到 6 年前
        1
  •  4
  •   Community Mohan Dere    4 年前

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

    定义了“连续迭代器”(请参见 N3884 )作为

    还满足以下要求的随机访问迭代器:

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

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

    所以

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

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

        2
  •  2
  •   ShadowRanger    6 年前

    是的。 cppreference has a nice chart ,这表明 ContiguousIterator 包含的功能的超集 RandomAccessIterator (它本身是 BidirectionalIterator ,它是的超集 ForwardIterator 等)。

        3
  •  1
  •   Casey    6 年前

    CPPReference通过描述迭代器类别和概念将您引入歧途 ContiguousIterator C++标准中没有出现的。C++17将连续性定义为迭代器的一个属性,很像可变性。 [iterator.requirements.general]/6 :

    进一步满足以下要求的迭代器: n 和可取消引用的迭代器值 a (a + n) , *(a + n) 相当于 *(addressof(*a) + n) ,被称为 连续迭代器 .

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

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

    A. 连续容器 是一个支持随机访问迭代器的容器,其成员类型为 iterator const_­iterator 是连续迭代器。

    这与[迭代器.需求.常规]/6的概念并不完全矛盾,即连续性独立于迭代器类别,但它确实引入了不一致性,这有助于引起混淆。