Страницы

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

среда, 17 апреля 2019 г.

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

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


Ответ

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

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

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