отключить заливку вектора при изменении размера? C ++ - PullRequest
7 голосов
/ 03 марта 2009

Я нахожусь в ситуации, когда я должен использовать функцию стиля c, которая возвращает скопированный len. Я решил, что я должен изменить размер до максимального, затем изменить размер до возвращенной длины увеличить размер вектора, переданного как память

Я знаю, что изменение размера устанавливает значение fillValue (всегда 0?). Таким образом, будет бессмысленная инициализация (надеюсь, меньше, чем МБ каждый раз) 60 раз в секунду. Есть ли способ отключить инициализацию при изменении размера?

1 Ответ

11 голосов
/ 03 марта 2009

В основном нет. Элементы в векторе по умолчанию создаются при изменении размера (для целого числа это приводит к 0).

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

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

Обновление:

Джон спросил:

Действительно ли гарантирован конструктор обнулить эту память? я думал так был неопределен?

Да и нет. Примитивные типы (int, bool, float и т. Д.) Имеют конструкторы по умолчанию, которые инициализируют их нулем. Однако, в отличие от обычных классов или структур, компилятор не вызывает их автоматически.

1019 * например *

int a;         // uninitialized
int b = int(); // initialized to 0

Поскольку vector :: resize использует последнюю форму при добавлении элементов, вам гарантируется, что созданные элементы будут правильно инициализированы нулем. Это верно для всех коллекций STL, которые неявно создают элементы.

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