Изменение размера std::vector и его остаточная емкость
Из описания std::vector::resize: https://www.cplusplus.com/reference/vector/vector/resize/
Никак не могу понять - при изменении размера вектора в меньшую сторону - его capacity гарантировано остается тем, что было до изменения размера или же на усмотрение реализации ?
Ответы (3 шт):
В стандарте ничего нет об изменении емкости. Если бы что-то такое происходило - об этом было бы написано, так как это могло бы приводить к неприятностям. Например, к перемещению памяти, т.е. к инвалидации итераторов/указателей на остающиеся в контейнере элементы, ко времени работы O(n) и т.д.
В стандарте все такие неприятности оговариваются явно.
Так что емкость будет неизменной.
"По-моему, так" (с) Пух
Изменение размера буфера вектора приводит к инвалидации всех итераторов и ссылок на все его элементы. При этом изменение размера буфера в большую сторону может быть и неявным (например при обычном emplace_back), а в меньшую сторону - только явным, при вызове shrink_to_fit. Соответственно метод resize (и reserve тоже) никогда не уменьшает capacity.
Сам контейнерный класс(в частности std::vector), не занимается распределением памяти, это делает отдельный класс _ его allocator_type, который передается вторым параметром шаблона. Так, что вы можете передать туда любой распределитель, и он останется стандартным вектором.
Если речь идет о стандартном распределителе, который передается по умолчанию, то он не может себе позволить выполнять не эффективные действия, в том числе и перераспределение памяти( в случаи, если контейнеру нужна память меньше, чем для него уже было распределено. Ответ однозначен _ стандартный распределитель гарантировано оставляет выделенную память тем, что было до изменения размера, если даже есть попытка изменить размера вектора в меньшую сторону (то есть стандартныйallocator_type::deallocate
ничего не делает в этом случаи).