инициализировать вектор из существующего массива - PullRequest
2 голосов
/ 20 августа 2010
const int NUMB = 4;
int n[] = {5,6,7,8};

// create a vector of strings using the n[] array
vector<int> partnums(n, n + NUMB);

Функции класса имя вектора (src.begin, src.end)

Создать вектор, инициализированный элементами из исходного контейнера, начиная с src.beginи заканчивается на scr.end

Согласно книге,

Векторные партнумы объявляются как векторный тип int и инициализируются элементами из массива n, начиная спервый элемент массива n [0] и заканчивающийся последним элементом массива , расположенным в позиции n + NUMB.

Я так и не понял."Расположен в позиции n + NUMB, индекс не начинается с 0? Или компилятор знает, что этот src.end ссылается на позицию 1 (scr.begin), и считает это с этой позиции в массиве n и считает до4 место)?

Спасибо

Ответы [ 4 ]

6 голосов
/ 20 августа 2010

Стандартная библиотека C ++ использует соглашение, что итератор 'end' фактически ссылается на один элемент после конца, поэтому в вашем случае 'begin' будет 0-й позицией, а 'end' - четвертой (не третьей) позицией.

В приведенной выше цитате сбивает с толку то, что n + NUMB упоминается как последний элемент в массиве, что неверно.Это (вымышленный) элемент после последнего элемента в массиве, который просто используется в качестве конечного маркера.

4 голосов
/ 20 августа 2010

С cplusplus.com :

Ввести итераторы в начальные и конечные позиции в последовательности.Используемый диапазон - [first, last), который включает все элементы между first и last, включая элемент, на который указывает first, но не элемент, на который указывает last.

n указывает на началомассива, и n + NUMB действует как арифметика указателя, эффективно увеличивая n на sizeof(int) * NUMB.Таким образом, n + NUMB указывает на «конец» массива (действительно, первый адрес после массива).Поскольку "end", заданный в инициализаторе, не включительно , он охватывает все элементы в массиве (индексы 0-3 или индексы от 0 до ( NUMB - 1 ) в общем случае).

3 голосов
/ 20 августа 2010

Одна из лучших статей, которые я нашел по этому вопросу, - здесь , объясняющая концепцию "один за концом"

1 голос
/ 20 августа 2010

n + NUMB - указатель на последний элемент + 1 или IOW на одну позицию за пределами размера массива.

при копировании он начинается с n + 0 и копируется до последнего элемента

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