Тип итератора std :: vector и допустимые операции

Требования к именам в C ++: ContiguousIterator относится к типу итератора std::vector как смежные Но нет определения для смежного итератора типа Вот.

станд :: вектор :: начать ссылается на тип итератора как итератор с произвольным доступом.

Означает ли это, что смежный итератор имеет тип произвольного доступа?

1

Решение

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 о том, что смежность не зависит от категории итераторов, но она вносит несоответствие, которое помогает вызвать путаницу.

1

Другие решения

[a] смежный итератор имеет тип произвольного доступа?

Да.

Определен «непрерывный итератор» (см. N3884) как

итератор произвольного доступа, который также отвечает следующим требованиям:

std::pointer_from(i) == std::addressof(*i) (когда i разыменовывается)

std::pointer_from(i + n) == std::pointer_from(i) + n (когда i + n является действительным итератором)

Так

  • «непрерывный итератор» подразумевает «итератор произвольного доступа»

  • «Итератор произвольного доступа» не подразумевает «непрерывный итератор» (см. std::deque для контрпример)

4

Ага. у cppreference есть хороший график, это дает понять, что ContiguousIterator включает в себя расширенный набор функций RandomAccessIterator (который сам по себе является надмножеством BidirectionalIterator, который является надмножеством ForwardIterator, так далее.).

2