Здесь 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.