Подтвердить что ты не робот

Будет ли вызов std::vector:: clear() установлен в значение std::vector:: capacity() равным нулю?

Если я использую .reserve(items) на векторе, вектор будет выделять достаточно памяти для моего предположения о количестве элементов, которые мне понадобятся.

Если позже я использую .clear(), это просто очистит вектор или сохранит мой ранее определенный резерв?

спасибо.

4b9b3361

Ответ 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, чтобы фактически избавиться от буфера или уменьшить его.