Метод shrink_to_fit
Метод shrink_to_fit класса vector уменьшает
емкость контейнера до его текущего размера. Другими словами,
он освобождает неиспользуемую память, которая была выделена
под возможный рост вектора. Метод не принимает параметров
и не возвращает значения. После его вызова емкость вектора
становится равна его размеру, хотя стандарт не гарантирует
этого на сто процентов - реализация может проигнорировать
запрос, если не может его выполнить.
Метод полезен, когда вектор больше не будет расширяться, а память нужно экономить. Например, после удаления большого количества элементов емкость вектора может оставаться большой, хотя размер уже маленький.
Синтаксис
vec.shrink_to_fit()
Пример
Давайте создадим вектор, добавим в него элементы, а затем посмотрим на его размер и емкость:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> vec;
for (int i = 1; i <= 100; i++) {
vec.push_back(i);
}
cout << "size: " << vec.size() << endl;
cout << "capacity: " << vec.capacity() << endl;
return 0;
}
Результат выполнения кода:
"size: 100"
"capacity: 128"
Пример
Как видно из предыдущего примера, емкость вектора больше
его размера. Давайте вызовем метод shrink_to_fit,
чтобы освободить лишнюю память:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> vec;
for (int i = 1; i <= 100; i++) {
vec.push_back(i);
}
cout << "before:" << endl;
cout << "size: " << vec.size() << endl;
cout << "capacity: " << vec.capacity() << endl;
vec.shrink_to_fit();
cout << "after:" << endl;
cout << "size: " << vec.size() << endl;
cout << "capacity: " << vec.capacity() << endl;
return 0;
}
Результат выполнения кода:
"before:"
"size: 100"
"capacity: 128"
"after:"
"size: 100"
"capacity: 100"
Пример
Метод shrink_to_fit особенно полезен после удаления
большого количества элементов из вектора. Давайте удалим
часть элементов и освободим память:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> vec = {1, 2, 3, 4, 5};
vec.reserve(1000);
vec.resize(3);
cout << "before:" << endl;
cout << "size: " << vec.size() << endl;
cout << "capacity: " << vec.capacity() << endl;
vec.shrink_to_fit();
cout << "after:" << endl;
cout << "size: " << vec.size() << endl;
cout << "capacity: " << vec.capacity() << endl;
for (int x : vec) {
cout << x << " ";
}
cout << endl;
return 0;
}
Результат выполнения кода:
"before:"
"size: 3"
"capacity: 1000"
"after:"
"size: 3"
"capacity: 3"
1 2 3