Почему vector.begin() не равен & vector [0]?

Здесь http://www.parashift.com/c++-faq/vector-is-contiguous.html указано, что 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.