Почему бы не изменить размер и не очистить изображение в GotW 54?

StackOverflow https://stackoverflow.com/questions/1720953

  •  19-09-2019
  •  | 
  •  

Вопрос

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

  1. Правильный способ «сжиматься» вектор или дека и

  2. Правильный способ полностью очистить вектор или 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.В типичной реализации стирание, изменение размера (при уменьшении размера) и очистка не влияют на емкость:вектор сохраняет память для себя, если вы захотите добавить к нему новые элементы позже.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top