Страницы

Поиск по вопросам

воскресенье, 9 февраля 2020 г.

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

#cpp #оптимизация #vector #stl


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


Ответы

Ответ 1



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

Комментариев нет:

Отправить комментарий