Будет ли обращение к std :: vector :: clear () установить в ноль std :: vector ::acity ()? - PullRequest
43 голосов
/ 13 апреля 2010

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

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

спасибо.

Ответы [ 5 ]

46 голосов
/ 13 апреля 2010

Указано, что std::vector<T>::clear() влияет на размер. Это может не повлиять на емкость. Для сброса емкости используйте трюк подкачки :

    std::vector<int> v1;

    // somehow increase capacity

    std::vector<int>().swap(v1);

Примечание: Так как этот старый ответ все еще получает отклик (поэтому люди его читают), я чувствую необходимость добавить, что C ++ 11 добавил std::vector<...>::shrink_to_fit(), который запрашивает вектор для удаления неиспользуемой емкости.

11 голосов
/ 13 апреля 2010

Вероятно, он не освободит зарезервированную память, хотя я не думаю, что поведение указано в стандарте.

РЕДАКТИРОВАТЬ: Хорошо, только что проверил, и стандарт только говорит, что пост-условие это size() == 0, хотя я не сталкивался с реализацией vector, которая не держится за зарезервированная память.

8 голосов
/ 13 апреля 2010

Нет, не будет. Попробуйте по телефону vector::capacity().

Еще одним доказательством этого является появление shrink_to_fit. Рабочий проект стандарта упоминает:

Примечания: shrink_to_fit - необязательный запрос уменьшить емкость () до размера (). [ Примечание: Запрос не является обязательным для разрешить широту для специфичные для реализации оптимизации . —Конечная записка]

1 голос
/ 13 апреля 2010

Нет, он не установит Reserve () в 0. Вызов clear () вызывает деструкторы каждого элемента и удаляет их из вектора, оставляя контейнер с размером 0, но емкость остается неизменной.

0 голосов
/ 13 апреля 2010

Это не повлияет на размер основного буфера. Вот почему вы должны использовать такие трюки, как this , чтобы на самом деле избавиться от буфера или сделать его меньше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...