Будет ли вызов std::vector:: clear() установлен в значение std::vector:: capacity() равным нулю?
Если я использую .reserve(items) на векторе, вектор будет выделять достаточно памяти для моего предположения о количестве элементов, которые мне понадобятся.
Если позже я использую .clear(), это просто очистит вектор или сохранит мой ранее определенный резерв?
спасибо.
Ответы
Ответ 1
Указывается, что std::vector<T>::clear()
влияет на размер. Это может не повлиять на емкость. Для сброса емкости используйте трюк подкачки:
std::vector<int> v1;
// somehow increase capacity
std::vector<int>().swap(v1);
Примечание:. Поскольку этот старый ответ по-прежнему получает upvotes (поэтому люди его читают), я чувствую необходимость добавить, что С++ 11 добавил std::vector<...>::shrink_to_fit()
, который запрашивает вектор для удаления неиспользуемой емкости.
Ответ 2
Он, вероятно, не выпустит зарезервированную память, хотя я не думаю, что поведение указано в стандарте.
РЕДАКТИРОВАТЬ: Хорошо, только что отметили, и в стандарте говорится, что пост-условие - это size() == 0
, хотя я не сталкивался с реализацией vector
, которая не укладывается в зарезервированная память.
Ответ 3
Нет, не будет. Попробуйте, набрав vector::capacity()
.
Дальнейшее доказательство этого - появление shrink_to_fit
. В стандартном рабочем проекте упоминается:
Примечание: shrink_to_fit - это необязательный запрос для уменьшения емкости() до size(). [ Примечание: Запрос не является обязательным для разрешить широту для оптимизация реализации. -end note]
Ответ 4
Нет, он не будет устанавливать reserve() в 0. Вызов clear() вызывает деструкторы каждого элемента и удаляет их из вектора, оставляя контейнер с размером 0, но емкость остается неизменной.
Ответ 5
Это не повлияет на размер базового буфера. Вот почему вы должны использовать трюки, такие как this, чтобы фактически избавиться от буфера или уменьшить его.