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

时间:2018-02-14 02:36:16

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

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

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

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

3 个答案:

答案 0 :(得分: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的反例)

答案 1 :(得分:2)

烨。 cppreference has a nice chart,明确指出ContiguousIterator包含RandomAccessIterator(它本身就是BidirectionalIterator的超集的超集,ForwardIterator.reg file的超集。等等。)。

答案 2 :(得分:1)

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

  

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

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

在实践中,我并不认为这种灵活性可以提供任何表达式,其中连续迭代器是随机访问迭代器的改进。实际上,标准库容器要求将连续容器定义为([container.requirements]/13):

  

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

与[iterator.requirements.general] / 6的概念并不完全相矛盾,即连续性与迭代器类别无关,但它确实引入了一个有助于引起混淆的不一致性。