Помощь по 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
?
Может кто-нибудь указать на разницу?
В случае begin () не является ли итератор произвольного доступа просто указателем?
Нет, итератор имеет некоторую семантику указателя, но на самом деле это класс.
И даже если это так, это должно ответить на вопрос. Это все равно что спросить, почему адрес указателя не совпадает с адресом объекта, на который он указывает.
Вы получите то же значение, если разыменуете итератор, который даст вам первый элемент:
&(*vec.begin())
так как
*vec.begin() == vec.front()
В соответствии с Страуструп в Язык программирования C ++, Раздел 16.3.3; думать о front()
в качестве первого элемента и begin()
как указатель на первый элемент.
Для вектора begin()
а также end()
вернуть итераторы произвольного доступа. Они могут вернуть простой указатель; это нормально, потому что он отвечает требованиям быть итератором произвольного доступа. В частности, вы можете написать *begin()
получить ссылку на первый объект в последовательности (при условии, что он есть). front()
дает ссылку на первый объект в последовательности, не проходя через промежуточный итератор. Как это:
vector<int> v;
v.push_back(3);
int i = *v.begin(); // i == 3
int j = v.front(); // j == 3
Предполагая, что у вас есть хотя бы 1 элемент в векторе,
vec.front()
такой же как
*vec.begin()