Почему бы не изменить размер и очистить работы в GotW 54? - PullRequest
3 голосов
/ 12 ноября 2009

Ссылаясь на статью Получил 54 от HerbSutter, он объясняет о

  1. Правильный путь к усадке вектор или deque и

  2. Правильный способ полностью очистить вектор или Deque

Можем ли мы просто использовать container.resize() и container.clear() для вышеуказанной задачи или я что-то упустил?

Ответы [ 3 ]

6 голосов
/ 12 ноября 2009

Вектор содержит две разные вещи: 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

В конце концов, емкость не должна изменяться при каждой операции, поскольку это приведет к значительным накладным расходам на выделение / освобождение памяти. Он говорит, что если вам нужно " освободить " память, зарезервированную вектором, сделайте это.

3 голосов
/ 12 ноября 2009

Ни resize (), ни clear () не работают. .capacity() вектора гарантированно будет по крайней мере таким же большим, как ток size() вектора, и гарантированно будет по крайней мере таким же большим, как емкость reserve() d. Кроме того, это. capacity() не сжимается, поэтому оно также, по крайней мере, такое же большое, как любой предыдущий size() или reserve().

Теперь, .capacity() вектора - это просто память, которую он зарезервировал. Часто не вся эта память содержит объекты. Изменение размера удаляет объекты, но не перезапускает память. Вектор может перезапускать свой буфер памяти только при выделении большего буфера.

Трюк подкачки работает путем копирования всех объектов в меньший, более подходящий буфер памяти. После этого оригинальный буфер памяти может быть переработан. Это нарушает предыдущее утверждение, что буфер памяти вектора может только расти. Однако с помощью трюка со свопом у вас временно есть 2 векторов.

1 голос
/ 12 ноября 2009

Вектор имеет размер и емкость. Он может содержать элементы X, но иметь неинициализированную память для хранения элементов Y больше. В типичной реализации стирание, изменение размера (при уменьшении размера) и очистка не влияют на емкость: вектор сохраняет память для себя, если вы хотите добавить в нее новые элементы позже.

...