2009-03-29 7 views
3

Я пытаюсь использовать boost :: unordered_map для кеширования некоторых значений. Я пытаюсь указать минимальное количество ведер в конструкторе:Укажите минимальное количество ковшей при создании 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

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

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

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

+0

Что такое спецификация MSDN и C++ 0x для объекта boost? – efaj

3

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