Изменение размера std::vector и его остаточная емкость

Из описания std::vector::resize: https://www.cplusplus.com/reference/vector/vector/resize/

Никак не могу понять - при изменении размера вектора в меньшую сторону - его capacity гарантировано остается тем, что было до изменения размера или же на усмотрение реализации ?


Ответы (3 шт):

Автор решения: Harry

В стандарте ничего нет об изменении емкости. Если бы что-то такое происходило - об этом было бы написано, так как это могло бы приводить к неприятностям. Например, к перемещению памяти, т.е. к инвалидации итераторов/указателей на остающиеся в контейнере элементы, ко времени работы O(n) и т.д.

В стандарте все такие неприятности оговариваются явно.

Так что емкость будет неизменной.

"По-моему, так" (с) Пух

→ Ссылка
Автор решения: user7860670

Изменение размера буфера вектора приводит к инвалидации всех итераторов и ссылок на все его элементы. При этом изменение размера буфера в большую сторону может быть и неявным (например при обычном emplace_back), а в меньшую сторону - только явным, при вызове shrink_to_fit. Соответственно метод resizereserve тоже) никогда не уменьшает capacity.

→ Ссылка
Автор решения: AR Hovsepyan

Сам контейнерный класс(в частности std::vector), не занимается распределением памяти, это делает отдельный класс _ его allocator_type, который передается вторым параметром шаблона. Так, что вы можете передать туда любой распределитель, и он останется стандартным вектором.

Если речь идет о стандартном распределителе, который передается по умолчанию, то он не может себе позволить выполнять не эффективные действия, в том числе и перераспределение памяти( в случаи, если контейнеру нужна память меньше, чем для него уже было распределено. Ответ однозначен _ стандартный распределитель гарантировано оставляет выделенную память тем, что было до изменения размера, если даже есть попытка изменить размера вектора в меньшую сторону (то есть стандартныйallocator_type::deallocate ничего не делает в этом случаи).

→ Ссылка