Укажите минимальное количество сегментов при построении boost::unordered_map
-
22-08-2019 - |
Вопрос
Я пытаюсь использовать boost::unordered_map для кэширования некоторых значений.Я пытаюсь указать минимальное количество сегментов в конструкторе:
#include <boost/unordered_map.hpp>
typedef boost::unordered_map<float, float> Mycache;
Mycache cache((std::size_t)25165843,
boost::hash<float>(),
std::equal_to<float>(),
std::allocator<std::pair<float const, float> >());
Но когда я показываю информацию о своей unordered_map в конце программы:
г++:
unordered_map.size(): 15861612
unordered_map.load_factor: 10.0845
unordered_map.bucket_count: 1572869
unordered_map.max_size: 1572868
unordered_map.max_load_factor: 1
unordered_map.max_bucket_count: 1572869
ВС++:
unordered_map.size(): 13916119
unordered_map.load_factor: 8.8476
unordered_map.bucket_count: 1572869
unordered_map.max_size: 1572868
unordered_map.max_load_factor: 1
unordered_map.max_bucket_count: 1572869
Как указать минимальное количество сегментов?
Решение
boost::unordered_map::max_bucket_count()
возвращает зависящее от реализации ограничение на количество сегментов unordered_map
.Похоже, вы превысили этот предел с помощью параметра конструктора.Обратите внимание: хотя MSDN определяет это максимальное количество сегментов, разрешенное «на данный момент» (что бы это ни значило), спецификация C++0x определяет это как максимальное количество сегментов, которое может когда-либо иметь карта.
Я никогда не использовал этот класс и не вижу в черновике спецификации C++0x ничего, что могло бы объяснить, почему конструктор молча создает объект, который не делает то, что вы ему сказали.
Я также не знаю, какая мотивация может стоять за этой ценностью. 1572869
, кроме того, это большое простое число.
Другие советы
Другой ответ верен в отношении стандарта, но небольшой max_bucket_count
на самом деле это ошибка в Boost 1.38, любая другая версия позволит вам использовать больше сегментов.