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

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

Ответ 1

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

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

После этого persons "сжато, чтобы соответствовать".

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

Ответ 2

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

Ответ 3

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

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

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

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

Ответ 4

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

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

Обратите внимание, что нет гарантии, что person.capacity(); после того, как трюк свопа равен размер: способность вектора (человека) - это способность реализации библиотеки резервы к векторам size persons.size().

С++ 11 представил shrink_to_fit().

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

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

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

Ответ 5

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