Вопрос

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

Это было полезно?

Решение

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

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

После этого person "сокращается до размера".

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

Другие советы

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

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

Эй, вуаля, ваш вектор имеет точно такой же размер, как и его содержимое.

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

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

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

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 () реализуется в условия подкачки трюк ...

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

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