C ++ вектор - push_back - PullRequest
       4

C ++ вектор - push_back

1 голос
/ 31 января 2011

В книге C ++ Primer, глава (3), есть следующий цикл for, который сбрасывает элементы в векторе на ноль.

vector<int> ivec; //UPDATE: vector declaration
for (vector<int>::size_type ix = 0; ix ! = ivec.size(); ++ix)
ivec[ix] = 0;

Действительно ли цикл for присваивает элементам значения 0, или мы должны использовать функцию push_back?

Итак, верно ли следующее?

ivec[ix] = ix;

Спасибо.

Ответы [ 5 ]

4 голосов
/ 31 января 2011

Действительно ли цикл for назначает 0 значения для элементов? Или мы должны использовать функцию push_back?

ivec[ix] =0 обновляет значение существующего элемента в векторе, тогда как функция push_back добавляет новый элемент в вектор!

Итак, верно ли следующее?
ivec [ix] = ix;

Совершенно верно IF ix < ivec.size().

Было бы еще лучше, если бы вы использовали iterator вместо индекса. Вот так

int ix = 0;
for(vector<int>::iterator it = ivec.begin() ; it != ivec.end(); ++it)
{ 
     *it = ix++; //or do whatever you want to do with "it" here!
}

Использование iterator с STL идиоматично. Предпочитаю итератор по индексу!

2 голосов
/ 31 января 2011

Да, вы можете использовать квадратные скобки для извлечения и перезаписи существующих элементов вектора. Однако обратите внимание, что вы не можете использовать квадратные скобки для вставки нового элемента в вектор, и на самом деле индексирование после конца вектора приводит к неопределенному поведению, часто приводящему к краху программы.

Чтобы увеличить вектор, вы можете использовать функции push_back, вставки, изменения размера или назначения функций.

0 голосов
/ 31 января 2011

Да, при условии, что ix является допустимым индексом, скорее всего: у вас есть вектор int, а индекс - size_type.Конечно, вы можете нарочно сохранить -1, чтобы иногда показывать недопустимый индекс, поэтому было бы целесообразно преобразовать неподписанное в подписанное, но тогда я бы предложил использовать static_cast.

Делать то, что вы делаете (устанавливая каждое значениев векторе к его индексу) есть способ создания индексов других коллекций.Затем вы переставляете векторную сортировку на основе предиката другой коллекции.

При условии, что вы никогда не переполнитесь (очень маловероятно, если ваша система 32-битная или более), ваше преобразование должно работать.

0 голосов
/ 31 января 2011

Целью этого цикла for является итерация по элементам вектора. Начиная с элемента x (когда ix равен 0) до последнего элемента (когда ix равен ivec.size () -1).

На каждой итерации текущий элемент вектора устанавливается равным 9. Это то, что утверждение

ivec[ix] = 0;

делает. Положив

ivec[ix] = ix;

в цикле for установит все элементы вектора в их положение в векторе. то есть первый элемент будет иметь значение ноль (поскольку векторы начинают индексироваться с 0), второй элемент будет иметь значение 1 и т. д. и т. д.

0 голосов
/ 31 января 2011

Используя скобки массива, векторный объект действует так же, как и любой другой простой массив. push_back() увеличивает его длину на один элемент и устанавливает новый / последний из переданных вами значений.

...