[英]std::vector iterator type and permissible operations
以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的观点相矛盾,即连续性独立于迭代器类别,但确实引入了一个不一致,这会引起混乱。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.