РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
292 of 815 menu

Метод 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,
    который возвращает коэффициент загрузки
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить