Будет вызов к станд.:: вектор:: ясный () станд. набора:: вектор:: способность () для обнуления?

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

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

спасибо.

45
задан John Zwinck 1 August 2017 в 09:49
поделиться

5 ответов

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

    std::vector<int> v1;

    // somehow increase capacity

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

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

49
ответ дан 26 November 2019 в 21:21
поделиться

Нет, не будет. Попробуйте это, вызвав vector :: capacity () .

Дополнительным свидетельством этого является появление shrink_to_fit . В рабочем проекте стандарта упоминается:

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

8
ответ дан 26 November 2019 в 21:21
поделиться

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

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

11
ответ дан 26 November 2019 в 21:21
поделиться

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

0
ответ дан 26 November 2019 в 21:21
поделиться

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

1
ответ дан 26 November 2019 в 21:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: