В C++ существует несколько веских причин использовать массив C над std::vector
. Одной из немногих убедительных причин, по крайней мере, с C++ 03, был тот факт, что невозможно использовать вектор для выделения неинициализированного массива объектов. "Заполнить" конструктор std::vector
является:Инициализированные значением объекты в C++ 11 и std :: vector constructor
vector(size_type count, const T& value = T())
Это означает, что ...
int* array = new array[1000000];
, вероятно, будет гораздо более эффективным, чем:
std::vector<int> v(1000000);
... так вектор-конструктор должен будет нуль инициализировать массив целых чисел. Таким образом, при работе с вектором POD нет реального эквивалента malloc
; лучшее, что вы можете получить, эквивалентно calloc
.
C++ 11, похоже, изменил это, с понятием «инициализация ценности». В C++ 11 std::vector
имеет новый конструктор, который принимает одно значение size_type
, без аргумента по умолчанию. Это «значение-инициализирует» все элементы вектора. Стандарт C++ 11 различает «инициализацию значения» и «нулевую инициализацию».
Насколько я понимаю, «инициализация значения» эквивалентна вызову конструктора по умолчанию на T
. Если T
- это тип POD, такой как int
, тогда конструктор по умолчанию просто создает неинициализированное целое число. Таким образом, в C++ 11 explicit vector::vector(size_type count)
действительно эквивалентен malloc
, если T
является POD.
Однако мое понимание этого основано на проекте C++ 11, а не на окончательном стандарте.
Вопрос: Мое понимание здесь правильно? explicit vector::vector(size_type count)
предоставляет неинициализированный массив (аналогично malloc
), если T
является POD?
Инициализация значения означает инициализацию нуля для встроенных типов. – juanchopanza
Если вы хотите неинициализированное хранилище, используйте «вектор :: резерв», как всегда. – Pubby
@Channel: C++ 03 также имеет инициализацию значения в отличие от инициализации по умолчанию и инициализации нуля. Единственный соответствующий бит, который был изменен, был сам 'std :: vector'. –