Использовать std :: vector как изменяемый, полностью заполненный массив? - PullRequest
2 голосов
/ 22 декабря 2011

Я использую вектор.Для моих целей обычно требуется, чтобы он имел (n) элементов, которые будут доступны и изменены только с помощью оператора index [].

В определенный момент мой алгоритм решит, что ему нужно больше места, и чтонужно увеличить этот вектор, чтобы сказать ... в 2 раза больше его размера.

Есть ли способ, которым я могу удвоить размер и инициализировать все новое пространство в векторном значении по умолчанию с типом элемента вектора?

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

Итак, я хочу получить эффект, аналогичный созданию нового вектора с помощью этого конструктора:

std::vector<MyType> vec(2*oldvec.size(), MyType());

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

Ответы [ 4 ]

8 голосов
/ 22 декабря 2011

Вы хотите std :: vector :: resize () .

4 голосов
/ 22 декабря 2011

Вам просто нужно изменить размер вектора, используя resize: http://www.cplusplus.com/reference/stl/vector/resize/

2 голосов
/ 22 декабря 2011

Попробуйте vec.resize(newsize, MyType()).

0 голосов
/ 22 декабря 2011

Как уже упоминалось в других ответах, векторный метод resize установит размер текущего вектора на запрошенное значение. Предполагая, что указанный размер больше, он заполнит новые записи вектора копией предоставленного значения по умолчанию.

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

Нужна ли инициализация новых элементов значением по умолчанию? Если нет, вы можете избавить себя от неприятностей, а если объект не является нативным типом, то стоит многократно создавать значение по умолчанию, просто оставляя его неинициализированным до тех пор, пока не потребуется местоположение вектора. В этом случае просто добавьте больше (неинициализированного) пространства хранения к вектору, используя метод reserve, и добавьте новые значения в вектор по мере необходимости, используя процедуры push / pop.

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