Укажите минимальное количество сегментов при создании boost :: unordered_map - PullRequest
3 голосов
/ 29 марта 2009

Я пытаюсь использовать 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

VC ++:

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

Как указать минимальное количество сегментов?

Ответы [ 2 ]

3 голосов
/ 22 июня 2009

Другой правильный ответ относительно стандарта, но маленький max_bucket_count на самом деле является ошибкой в ​​Boost 1.38, любая другая версия позволит вам использовать больше блоков.

2 голосов
/ 29 марта 2009

boost::unordered_map::max_bucket_count() возвращает зависящее от реализации ограничение на количество сегментов unordered_map. Похоже, вы превысили этот предел с помощью вашего параметра конструктора. Обратите внимание, что в то время как MSDN определяет это как максимальное допустимое количество сегментов (в настоящее время) (что бы это ни значило), спецификация C ++ 0x определяет его как наибольшее количество сегментов, которое может иметь карта.

Я никогда не использовал этот класс, и я не вижу ничего в черновой спецификации C ++ 0x, чтобы объяснить, почему конструктор молча создает объект, который не выполняет то, что вы ему сказали.

Я также не знаю, какая мотивация может быть за значением 1572869, кроме того, что это крупное простое число.

...