Почему бы не изменить размер и очистить работы в GotW 54?
Ссылаясь на статью Gotw 54 от HerbSutter, он объясняет
Правильный способ "сжать, чтобы подогнать" вектор или деку и
Правильный способ полностью очистить вектор или деку
Можем ли мы просто использовать
container.resize()
а такжеcontainer.clear()
для вышеуказанной задачи или я что-то упустил?
3 ответа
Есть две разные вещи, которые вектор содержит: size
Vs 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 больше. В типичной реализации стирание, изменение размера (при уменьшении размера) и очистка не влияют на емкость: вектор сохраняет память для себя, если вы захотите добавить в нее новые элементы позже.