Требования к именам в C ++: ContiguousIterator относится к типу итератора std::vector
как смежные Но нет определения для смежного итератора типа Вот.
станд :: вектор :: начать ссылается на тип итератора как итератор с произвольным доступом.
Означает ли это, что смежный итератор имеет тип произвольного доступа?
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 о том, что смежность не зависит от категории итераторов, но она вносит несоответствие, которое помогает вызвать путаницу.
[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
, так далее.).