Почему std :: vector :: iterator не является смежным итератором? - PullRequest
0 голосов
/ 10 апреля 2020

По данным cppref из std::vector:

iterator LegacyRandomAccessIterator

Также с другой cppref страницы :

Следующие стандартные типы библиотек: LegacyContiguousIterators :

vector::iterator для значения типа, отличного от bool.

Что правильно?

Ответы [ 2 ]

5 голосов
/ 10 апреля 2020

Оба верны. Все векторные итераторы являются итераторами с произвольным доступом. Все итераторы вектора, за исключением вектора типа bool, являются смежными итераторами. Обратите внимание, что все смежные итераторы также являются итераторами с произвольным доступом.

Предыдущее утверждение просто не предоставляет столько информации, и, возможно, не было обновлено после изменений с c ++ 17, в которых введено имя для требований непрерывного итератора.

4 голосов
/ 10 апреля 2020

std::vector<T>::iterator (для T, отличных от bool) - это непрерывный итератор.

[vector.overview] / 2 :

A vector соответствует всем требованиям контейнера и [...] для элемента, отличного от bool, смежного контейнера.

[container.requirements.general] / 13 (выделение):

Непрерывный контейнер - это контейнер, чьи типы-члены итераторы и const_iterator соответствуют требованиям Cpp17RandomAccessIterator ([random.access). итераторы]) и модель contiguous_iterator ([iterator.concept.contiguous]).


По данным cppref из std::vector:

iterator LegacyRandomAccessIterator

Это не означает, что итератор не является непрерывным итератором. Это даже не говорит о непрерывном итераторе.

На той же странице также упоминается:

std::vector (для T кроме bool) соответствует требованиям [.. .] ContiguousContainer [...].

И На странице ContiguousContainer написано:

Тип X удовлетворяет ContiguousContainer если

  • [...]
  • Типы элементов X::iterator и X::const_iterator являются LegacyContiguousIterators
...