Разница между std :: vector :: front () и begin ()

Помощь по vector говорит о front()

Возвращает ссылку на первый элемент в векторном контейнере.
В отличие от члена vector::begin, который возвращает итератор к тому же элементу, эта функция> возвращает прямую ссылку.

Помощь по вектору говорит о begin()

Возвращает итератор, ссылающийся на первый элемент в векторном контейнере.
Обратите внимание, что в отличие от члена vector::front, которая возвращает ссылку на первый элемент,> эта функция возвращает итератор произвольного доступа.

И этот код выводит:

char arr[] = { 'A', 'B', 'C' };
vector<char> vec(arr, arr+sizeof(arr));
cout << "address of vec.front() " << (void*)&vec.front() << endl;
cout << "address of vec.begin() " << (void*)&vec.begin() << endl;

адрес vec.front() 00401F90
адрес vec.begin() 0030F494

Я не понимаю, что означает «прямая ссылка»? В случае begin() не является random access iterator просто pointer?

Может кто-нибудь указать на разницу?

4

Решение

В случае begin () не является ли итератор произвольного доступа просто указателем?

Нет, итератор имеет некоторую семантику указателя, но на самом деле это класс.

И даже если это так, это должно ответить на вопрос. Это все равно что спросить, почему адрес указателя не совпадает с адресом объекта, на который он указывает.

Вы получите то же значение, если разыменуете итератор, который даст вам первый элемент:

&(*vec.begin())

так как

*vec.begin() == vec.front()
8

Другие решения

В соответствии с Страуструп в Язык программирования C ++, Раздел 16.3.3; думать о front() в качестве первого элемента и begin() как указатель на первый элемент.

11

Для вектора begin() а также end() вернуть итераторы произвольного доступа. Они могут вернуть простой указатель; это нормально, потому что он отвечает требованиям быть итератором произвольного доступа. В частности, вы можете написать *begin() получить ссылку на первый объект в последовательности (при условии, что он есть). front() дает ссылку на первый объект в последовательности, не проходя через промежуточный итератор. Как это:

vector<int> v;
v.push_back(3);
int i = *v.begin(); // i == 3
int j = v.front();  // j == 3
4

Предполагая, что у вас есть хотя бы 1 элемент в векторе,

vec.front()

такой же как

*vec.begin()
3
По вопросам рекламы [email protected]