Возврат итератора в vector :: begin () - PullRequest
0 голосов
/ 27 апреля 2018

Я не совсем понимаю, что на самом деле возвращает vector::begin().

Cplusplus.com сообщает мне, что vector::begin() возвращает итератор вектора, что означает, что для vector<int> v; он даст 0.

Однако при отладке в Visual Studio таблица наблюдения показала мне значение первого элемента v. Более того, в столбце «Тип» указано, что это был std::_Vector_iterator.

Как следствие, что на самом деле является результатом vector::begin()?

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Cplusplus.com сообщает мне, что vector::begin() возвращает итератор вектора,

Это правильно.

, что означает, что для vector<int> v; это даст 0.

Это неверный вывод из предыдущего утверждения. std::vector<T>::begin() возвращает итератор, который можно использовать для доступа к содержимому первого элемента объекта, если он не пустой.

Учитывая,

std::vector<int> v;
auto iter = v.begin();
int b = *iter; // Problem since the vector is empty.

и

std::vector<int> v{1, 3, 10};
auto iter = v.begin();
int b = *iter; // OK. b is the first element of the vector
int c = v[0];  // OK. c is also the first element of the vector.

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

Однако ...

std::vector<T>::iterator - это тип в шаблоне std::vector. Это RandomAccessIterator. Вы можете прочитать больше об этом, то есть RandomAccessIterator, в http://en.cppreference.com.

0 голосов
/ 27 апреля 2018

std::vector::begin возвращает итератор. Итератор - это обобщение указателя - это тип, который можно использовать для доступа к элементам контейнера. Каждый контейнер имеет свой собственный тип итератора. То, как именно представлены итераторы, является деталью реализации, вам, как программисту, следует заботиться только об их интерфейсе (и о гарантиях, которые они дают, о стабильности, валидности и т. Д. См. подходящую документацию для получения дополнительной информации).

Различные типы итераторов поддерживают разные операции: некоторые могут быть только увеличены (могут только двигаться вперед), некоторые также могут быть уменьшены (двигаться назад); некоторые должны двигаться по одному шагу за раз, некоторые могут перемещаться несколькими элементами за один раз; и т.д.

Итераторы, предоставляемые std::vector, являются произвольными и непрерывными, поэтому они функционируют почти так же, как указатели.

Для пустого std::vector вызов begin() даст вам тот же итератор, который возвращается при вызове end(). end() всегда возвращает специальный, последний конец итератор. Этот итератор не является разыменованным (он не указывает ни на какой элемент), он просто служит индикатором конца контейнера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...