Для чего нужен reserve() в C++?

221
11 декабря 2017, 15:44

Не могу понять, в чем смысл функции reserve(). Она выделяет память, но не создает элементов, увеличивает емкость, но не размер. Для чего она нужна если все можно сделать с помощью resize()?

Answer 1

Для оптимизации. resize требует инициализации всех элементов, и делает размер контейнера строго заказанным. Он становится заполненным чем-то - что вам может быть не нужно в данный момент. При этом вам придется отслеживать отдельно реальную заполненность вашего вектора, т.к. size() будет, по сути, врать - говоря, сколько всего элементов в векторе, а не элементов, нужных вам. Если же вы хотите добавлять с помощью resize() равно столько элементов, сколько вам в данный момент нужно - то это просто бестолку потраченное время на инициализацию и не более того... потому что каждый вызов будет вызывать перераспределение памяти и копирование.

reserve подготавливает место для последующего заполнения, так что какой-нибудь push_back будет гарантированно (а не амортизированно) выполняться за O(1) - без каких-либо перераспределений памяти, съедающих массу времени... При этом size() будет давать точное количество элементов, итератор end() показывать куда надо...

Примерно так. Если не убедил - могу еще немного поубеждать :)

READ ALSO
Баг с установкой LPMINMAXINFO

Баг с установкой LPMINMAXINFO

Дело такое, при обработке сообщения WM_GETMINMAXINFO и установке значений LPMINMAXINFO, при первой установке, те

240
Вывод изображения в ImageView

Вывод изображения в ImageView

Мне нужно чтобы юзер нажал на кнопку перешел в галерею выбрал изображения и он вставился в ImageViewНа эмуляторе все окей но при работа на устройстве...

233
Отправка картинки Андроид ява [дубликат]

Отправка картинки Андроид ява [дубликат]

Данный вопрос уже был задан и имеет решение:

289
Подсчет букв, символов и строк

Подсчет букв, символов и строк

Программа должна подсчитывать кол-во букв, символов и строкДля выхода из цикла есть оператор if, который при вводе пустой строки автоматически...

250