Как уменьшить std :: vector? - PullRequest
       42

Как уменьшить std :: vector?

34 голосов
/ 31 октября 2008

Есть ли способ изменить размер std::vector для уменьшения емкости, когда мне больше не нужно ранее зарезервированное пространство?

Ответы [ 5 ]

60 голосов
/ 31 октября 2008

Эффективный STL, Скотт Мейерс, пункт 17: Используйте трюк swap, чтобы урезать лишнюю емкость.

vector<Person>(persons).swap(persons);

После этого persons «сокращается, чтобы соответствовать».

Это зависит от того факта, что конструктор копирования vector выделяет столько памяти, сколько необходимо для копируемых элементов.

17 голосов
/ 02 марта 2012

Если вы используете C ++ 11, вы можете использовать vec.shrink_to_fit(). По крайней мере, в VS2010 это делает трюк со свопом.

8 голосов
/ 31 октября 2008

Создайте новый, временный вектор из существующего, затем вызовите метод swap для существующего, передав ему временный. Позвольте временному (теперь со старым, увеличенным, буфером) выйти из области видимости.

Привет, ваш вектор имеет правильный размер для своего содержимого.

Если это звучит как много копий и выделений - имейте в виду, что это то, что делает вектор, каждый раз, когда ему приходится перераспределять свой текущий зарезервированный лимит.

[Изменить] Да, я просто сказал то же самое, что и Себастьен, в нескольких словах. Еще один случай состязания с переполнением стека; -)

3 голосов
/ 20 ноября 2013

Трюк со свопом - эффективный способ уменьшить емкость объекта, он заменяет содержимое моего вектора на только что созданный с помощью конструкции копирования:

vector<Person>(persons).swap(persons);

Обратите внимание, что нет никакой гарантии, что people.capacity (); после того, как трюк подкачки равен размер: емкость вектора (человек) - емкость реализации библиотеки резервирует к векторам размера people.size ().

C ++ 11 представлен shrink_to_fit () .

shrink_to_fit (), а также трюк подкачки не гарантирует, что размер емкости эффективно уменьшен до размера вектора.

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

Имейте в виду, что уловка подкачки требует, чтобы people.size () копировал конструкции Person и разрушения person.size (). Shrink_to_fit () может избежать всего этого копирования и может оставьте ваши итераторы действительными. Мог. Но время от времени случается так, что shrink_to_fit () реализуется в условия подкачки трюк ...

0 голосов
/ 31 октября 2008

Вы ищете эквивалент QVector :: squeeze , и я боюсь, что он не существует явно в STL. Получите ответ Себастьяна, если он верен для вашей реализации STL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...