【发布时间】:2018-07-24 12:45:34
【问题描述】:
C++ named requirements: ContiguousIterator 指代std::vector 的迭代器类型为连续的。但是没有为类型连续迭代器here提供定义。
std::vector::begin 将迭代器类型称为随机访问迭代器。
这是否意味着连续迭代器属于随机访问类型?
【问题讨论】:
标签: c++ c++11 iterator c++17 contiguous
C++ named requirements: ContiguousIterator 指代std::vector 的迭代器类型为连续的。但是没有为类型连续迭代器here提供定义。
std::vector::begin 将迭代器类型称为随机访问迭代器。
这是否意味着连续迭代器属于随机访问类型?
【问题讨论】:
标签: c++ c++11 iterator c++17 contiguous
CPRPReference 通过描绘 C++ 标准中未出现的迭代器类别和概念 ContiguousIterator 让您误入歧途。 C++17 将连续性定义为迭代器的属性,就像可变性一样。 [iterator.requirements.general]/6:
进一步满足以下要求的迭代器:对于整数值
n和可解引用的迭代器值a和(a + n),*(a + n)等效于*(addressof(*a) + n),称为连续迭代器 .
值得注意的是,此属性独立于迭代器类别。理论上,您可以定义一个满足连续迭代器要求和任何迭代器类别要求的迭代器。
在实践中,我认为这种灵活性不会为连续迭代器是随机访问迭代器的改进的设计提供任何表现力。事实上,标准库容器要求将 contiguous container 定义为 ([container.requirements]/13):
连续容器是支持随机访问迭代器的容器,其成员类型
iterator和const_iterator是连续迭代器。
这并不完全违背 [iterator.requirements.general]/6 的概念,即连续性独立于迭代器类别,但它确实引入了有助于引起混淆的不一致。
【讨论】:
RandomAccessIterator 等)。我有点倾向于只是补充一些,并说ContiguousIterator 改进了 RAI。
[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 has a nice chart,这清楚地表明ContiguousIterator 包含RandomAccessIterator 的功能的超集(它本身是BidirectionalIterator 的超集,它是@987654325@ 的超集等)。
【讨论】: