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 гарантирует "сжатие" вектора до фактического размера.