C++ 命名要求: ContiguousIterator将迭代器的类型std::vector
称为连续。但是这里没有为类型连续迭代器提供定义。
std::vector::begin将迭代器类型称为随机访问迭代器。
这是否意味着连续迭代器属于随机访问类型?
C++ 命名要求: ContiguousIterator将迭代器的类型std::vector
称为连续。但是这里没有为类型连续迭代器提供定义。
std::vector::begin将迭代器类型称为随机访问迭代器。
这是否意味着连续迭代器属于随机访问类型?
[a] 连续迭代器是随机访问类型的吗?
是的。
“连续迭代器”被定义(见N3884)为
一个随机访问迭代器,也满足以下要求:
std::pointer_from(i) == std::addressof(*i)
(何时i
可取消引用)
std::pointer_from(i + n) == std::pointer_from(i) + n
(什么时候i + n
是一个有效的迭代器)
所以
“连续迭代器”意味着“随机访问迭代器”
“随机访问迭代器”并不意味着“连续迭代器”(参见std::deque
反例)
是的。cppreference 有一个很好的图表,它清楚地表明它ContiguousIterator
包含 的特征的超集RandomAccessIterator
(它本身是 的超集BidirectionalIterator
,它是 的超集ForwardIterator
,等等)。
CPPReference 通过描绘ContiguousIterator
C++ 标准中未出现的迭代器类别和概念将您引入歧途。C++17 将连续性定义为迭代器的属性,很像可变性。[iterator.requirements.general]/6:
进一步满足以下要求的迭代器,对于整数值
n
和可解引用的迭代器值a
和(a + n)
,*(a + n)
等价于*(addressof(*a) + n)
,称为连续迭代器。
值得注意的是,此属性独立于迭代器类别。理论上,您可以定义一个满足连续迭代器要求和任何迭代器类别要求的迭代器。
在实践中,我认为这种灵活性不会为连续迭代器是随机访问迭代器的改进的设计提供任何表现力。事实上,标准库容器要求将连续容器定义为([container.requirements]/13):
连续容器是支持随机访问迭代器的容器,其成员类型和
iterator
是const_iterator
连续迭代器。
这并不完全违背 [iterator.requirements.general]/6 的概念,即连续性独立于迭代器类别,但它确实引入了有助于引起混淆的不一致。