Хотя ваши примеры, по сути, совпадают, может случиться так, что когда используемый тип не является int
, выбор за вами. Если ваш тип не имеет конструктора по умолчанию или если вам все равно придется заново конструировать каждый элемент позже, я бы использовал reserve
. Только не попадитесь в ловушку, которую я сделал, и используйте reserve
, а затем operator[]
для инициализации!
Конструктор
std::vector<MyType> myVec(numberOfElementsToStart);
int size = myVec.size();
int capacity = myVec.capacity();
В этом первом случае, используя конструктор, size
и numberOfElementsToStart
будут равны, а capacity
будет больше или равно им.
Думайте о myVec как о векторе, содержащем множество элементов MyType
, к которым можно получить доступ и изменить, push_back(anotherInstanceOfMyType)
добавит его в конец вектора.
Резерв
std::vector<MyType> myVec;
myVec.reserve(numberOfElementsToStart);
int size = myVec.size();
int capacity = myVec.capacity();
При использовании функции reserve
, size
будет 0
, пока вы не добавите элемент в массив, и capacity
не будет равен или больше numberOfElementsToStart
.
Думайте о myVec как о пустом векторе, к которому можно добавлять новые элементы, используя push_back
без выделения памяти как минимум для первых numberOfElementsToStart
элементов.
Обратите внимание, что push_back()
все еще требует внутренней проверки, чтобы гарантировать, что размер <емкость </em> и размер приращения , так что вы можете взвесить это по сравнению со стоимостью конструкции по умолчанию.
Инициализация списка
std::vector<MyType> myVec{ var1, var2, var3 };
Это дополнительная опция для инициализации вашего вектора, и хотя она возможна только для очень маленьких векторов, это простой способ инициализировать небольшой вектор с известными значениями. size
будет равно количеству элементов, с которыми вы его инициализировали, а capacity
будет равно или больше размера. Современные компиляторы могут оптимизировать создание временных объектов и предотвратить ненужное копирование.