мы можем инициализировать вектор, используя массив. предположим,
int a[]={1,2,3}
vector<int>x(a,a+3)
это путь. Мой вопрос: что такое a
и a+3
здесь, они указатели?
и кто-то может это объяснить: для вышеупомянутого массива
vector<int>x(a,&a[3])
также не дает ошибок и делает то же самое, что и код выше. Если мы пишем [3], он должен быть вне массива? может кто-нибудь сказать мне внутренний механизм?
Да, a
и a+3
- указатели. Обычная a
- это массив, который неявно преобразуется в указатель при падении шляпы.
Конструкция &a[3]
идентична по значению a+3
для простых C-массивов. Да, a[3]
находится вне массива, но одно прошлое разрешено указывать, если вы не разыгрываете его.
int a [] = {1,2,3}
vectorx (а, а + 3)
a - массив, поэтому он всегда указывает на его базовый адрес. a + 3 средняя база address+ (sizeof (int) * 3)
предположим, что базовый адрес равен 100 а = 100; а + 3 = 106;
vectorx (а, & а [3])
Здесь & a [3] эквивалентно a + 3
Конструктор векторного диапазона выглядит так:
template <class InputIterator>
vector (InputIterator first, InputIterator last,
const allocator_type& alloc = allocator_type());
Он будет создавать элементы в диапазоне [first, last)
, что означает, что последний элемент не включен. &a[3]
указывает на элемент вне границ массива, аналогично тому, как std::end(a)
будет указывать один за концом a
. Сравните это с:
std::vector<int> x(std::begin(a), std::end(a));
Кроме того, *(a + 3)
эквивалентно a[3]
.