Здесь http://www.parashift.com/c++-faq/vector-is-contiguous.html указано, что vector.begin()
может быть не равно &vector[0]
. Почему это определено таким образом. Что не позволяет vector.begin()
быть равно &vector[0]
?
Почему vector.begin() не равен & vector [0]?
Ответ 1
Итератор для вектора может быть определен как некоторый класс. Поскольку функция-член возвращает итератор, тогда нет необходимости, чтобы он был сырым указателем на первый элемент массива. Это может быть объект этого класса. Требуется только, чтобы итератор определил operator *
, который вернет ссылку на первый элемент вектора при условии, что вектор не пуст.
Ответ 2
Итератор, возвращаемый vector.begin()
технически, только позволяет вам получать значения через оператор разыменования на нем. Этот оператор разыменования мог делать всевозможные вещи внутри. Большинство реализаций просто сохраняют указатель на T
или являются указателем на T
, а затем просто разыгрывают его в своем операторе разыменования, но это не является требованием концепции итератора.
Смотрите: Iterator
концепция
Ответ 3
Если у нас есть вектор типа T
vector<T> v;
затем
v.begin()
имеет другой тип от &v[0]
v.begin()
имеет тип vector<T>::iterator
(если вектор не const) или vector<T>::const_iterator
(если вектор const).
&vector[0]
имеет тип T *
Теперь в некоторых реализациях векторный итератор реализуется как указатель на T. Поэтому некоторые программисты предположили, что векторные итераторы являются синонимами указателя на T. Этот стандарт не поддерживается стандартом. В других реализациях векторный итератор является классом.
Чтобы сформировать итератор, который указывает на N-й элемент в векторе, выражение
(v.begin() + N)
.
Чтобы сформировать указатель на N-й элемент в векторе, выражение
&v[N]
.
Эти выражения действительны независимо от того, как поставщик реализует векторные итераторы. Они также хорошо подходят для deque и string.