Это может быть ... особенно, если вы собираетесь со временем добавлять много элементов в свой вектор и хотите избежать автоматического расширения памяти, которое будет выполнять контейнер, когда у него кончаются доступные слоты.
Например, обратные вставки (то есть std::vector::push_back
) считаются амортизированными O (1) или процессом с постоянным временем, но это потому, что если вставка в концевектор сделан, и вектору не хватает места, он должен затем перераспределить память для нового массива элементов, скопировать старые элементы в новый массив, а затем он может скопировать элемент, который вы пытались вставить в контейнер.Этот процесс является O (N), или сложностью линейного времени, и для большого вектора, может занять довольно много времени.Использование метода reserve()
позволяет предварительно выделить память для вектора, если вы знаете, что он будет по крайней мере определенного размера, и избежать перераспределения памяти каждый раз, когда заканчивается пространство, особенно если вы собираетесь делать обратные вставкивнутри некоторого критичного к производительности кода, где вы хотите убедиться, что время выполнения вставки остается фактическим процессом сложности O (1) и не влечет за собой некоторое перераспределение скрытой памяти для массива.Конечно, ваш конструктор копирования должен был бы иметь сложность O (1), чтобы получить истинную сложность O (1) для всего процесса обратной вставки, но в отношении фактического алгоритма обратной вставки в вектор самим контейнером., вы можете сохранить известную сложность, если память для слота уже предварительно выделена.