Почему бы не изменить размер и не очистить изображение в GotW 54?
Вопрос
Ссылаясь на статью Получилось 54 от HerbSutter, он объясняет о
Правильный способ «сжиматься» вектор или дека и
Правильный способ полностью очистить вектор или deque
Можем ли мы просто использовать
container.resize()
иcontainer.clear()
Для приведенной выше задачи или я что -то упускаю?
Решение
Вектор содержит две разные вещи: size
Против capacity
.Если ты просто resize
вектора нет никакой гарантии, что емкость (объем зарезервированной памяти) должна измениться. resize
это операция, связанная с тем, сколько вы используете, а не с размером векторной емкости.
Так например.
size == how much you are using
capacity == how much memory is reserved
vector<int> v(10);
v.resize(5); // size == 5 but capacity (may or may) not be changed
v.clear() // size == 0 but capacity (may or may) not be changed
В конце концов, емкость не должна меняться при каждой операции, поскольку это приведет к большим накладным расходам при выделении/освобождении памяти.Он говорит, что если тебе нужно "освободить" память зарезервирована по вектору, сделайте это.
Другие советы
Ни resize(), ниclear() не работают.А .capacity()
вектора гарантированно будет не меньше текущего size()
вектора и гарантированно будет не меньше размера reserve()
д емкость.Кроме того, это .capacity()
не сжимается, поэтому он по крайней мере такой же большой, как и любой предыдущий size()
или reserve()
ация.
Сейчас .capacity()
вектора — это просто память, которую он зарезервировал.Часто не вся эта память содержит объекты.Изменение размера удаляет объекты, но не перезагружает память.Вектор может перезапустить свой буфер памяти только при выделении буфера большего размера.
Трюк с подкачкой работает путем копирования всех объектов в меньший и более подходящий буфер памяти.После этого исходный буфер памяти может быть переработан.Похоже, это нарушает предыдущее утверждение о том, что буфер памяти вектора может только расти.Однако с помощью трюка со свопом у вас временно есть 2 векторы.
Вектор имеет размер и емкость.Он может содержать элементы X, но имеет больше неинициализированной памяти для элементов Y.В типичной реализации стирание, изменение размера (при уменьшении размера) и очистка не влияют на емкость:вектор сохраняет память для себя, если вы захотите добавить к нему новые элементы позже.