Shrink To Fit

Идиома shrink-to-fit (фактически это просто вызов функции shrink_to_fit) используется для освобождения избыточной памяти, когда вектор значительно уменьшился, но его ёмкость (capacity) осталась прежней.

Неправильно:

std::vector<int> v;
v.reserve(1'000'000); // Выделили под миллион
// ... заполнили и потом удалили почти всё
v.erase(v.begin() + 10, v.end()); // Осталось 10 элементов
// v.size() == 10, но v.capacity() всё ещё >= 1'000'000
// Память не освобождена!

Проблема: erase и другие методы удаления никогда не уменьшают ёмкость. Вектор продолжает занимать память, достаточную для миллиона элементов, хотя реально хранит только 10.

До C++11 проблему решали через создание временного вектора и swap:

std::vector<int> v;
v.reserve(1'000'000);
v.erase(v.begin() + 10, v.end());
std::vector<int>(v).swap(v); // временная копия, громоздко и неочевидно

В С++11 в векторе появилась функция shrink_to_fit, которая решает проблему.

Правильно:

std::vector<int> v;
v.reserve(1'000'000);
v.erase(v.begin() + 10, v.end());
v.shrink_to_fit(); // Явный запрос: "освободи лишнюю память"
// Теперь v.capacity() максимально близка к v.size()

Примечание: в стандарте говорится, что shrink_to_fit не обязан уменьшать емкость до размера size (The request is non-binding to allow latitude for implementation-specific optimizations). Поэтому только старый способ через swap гарантирует "сжатие" вектора до фактического размера.