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