Метод reserve
Метод reserve класса unordered_map позволяет зарезервировать
внутреннюю память контейнера так, чтобы он мог хранить как минимум
указанное количество элементов без необходимости выполнять рехеширование.
В качестве параметра метод принимает целое число - ожидаемое количество
элементов n. Если текущая ёмкость контейнера уже достаточна,
метод не выполняет никаких действий.
Метод не изменяет размер контейнера и не добавляет элементы. Он лишь подготавливает внутреннюю структуру данных, чтобы последующие вставки выполнялись быстрее. Это особенно полезно, когда заранее известно, сколько элементов будет добавлено.
Синтаксис
umap.reserve(n)
Пример
Давайте создадим объект unordered_map и зарезервируем
в нём место для 100 элементов, а затем выведем количество
корзин до и после резервирования:
#include <iostream>
#include <unordered_map>
using namespace std;
int main()
{
unordered_map<int, string> umap;
cout << "Buckets before: " << umap.bucket_count() << endl;
umap.reserve(100);
cout << "Buckets after: " << umap.bucket_count() << endl;
return 0;
}
Результат выполнения кода:
"Buckets before: 1"
"Buckets after: 127"
Пример
Давайте покажем, как reserve влияет на количество
рехеширований при вставке большого количества элементов.
Сначала вставим элементы без резервирования:
#include <iostream>
#include <unordered_map>
using namespace std;
int main()
{
unordered_map<int, string> umap;
for (int i = 0; i < 1000; i++)
{
umap[i] = "item";
}
cout << "Size: " << umap.size() << endl;
cout << "Buckets: " << umap.bucket_count() << endl;
return 0;
}
Результат выполнения кода:
"Size: 1000"
"Buckets: 1069"
Пример
А теперь сделаем то же самое, но предварительно зарезервируем
место для 1000 элементов. Обратите внимание, что количество
корзин увеличится один раз:
#include <iostream>
#include <unordered_map>
using namespace std;
int main()
{
unordered_map<int, string> umap;
umap.reserve(1000);
cout << "Buckets after reserve: " << umap.bucket_count() << endl;
for (int i = 0; i < 1000; i++)
{
umap[i] = "item";
}
cout << "Size: " << umap.size() << endl;
cout << "Buckets: " << umap.bucket_count() << endl;
return 0;
}
Результат выполнения кода:
"Buckets after reserve: 1069"
"Size: 1000"
"Buckets: 1069"
Смотрите также
-
класс
unordered_map,
который представляет собой хеш-таблицу -
метод
rehash,
который перестраивает хеш-таблицу -
метод
bucket_count,
который возвращает количество корзин -
метод
load_factor,
который возвращает коэффициент загрузки