2009-03-29 12 views
3

Je suis en train d'utiliser boost :: unordered_map pour mettre en cache certaines valeurs. J'essaie de préciser le nombre minimum de seaux dans le constructeur:Indiquez le nombre minimum de godets lors de la construction d'un 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> >()); 

Mais quand j'afficher des informations sur mon unordered_map à la fin du programme:

g ++:

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 

Comment puis-je spécifier le nombre minimum de seaux?

Répondre

2

boost::unordered_map::max_bucket_count() retourne la limite en fonction de la mise en œuvre sur le nombre de seau d'un unordered_map. Vous semblez avoir dépassé cette limite avec votre paramètre constructeur. Notez que bien que MSDN définisse que ce soit le nombre maximal de compartiments "actuellement" autorisés (quel que soit ce que cela signifie), la spécification C++ 0x le définit comme étant le nombre maximal de compartiments que la carte peut avoir.

Je n'ai jamais utilisé la classe, et je ne vois rien dans le brouillon C++ 0x spec pour expliquer pourquoi le constructeur crée silencieusement un objet qui ne fait pas ce que vous lui avez dit.

Je ne sais pas non plus ce que la motivation pourrait être derrière la valeur 1572869, à part que c'est un premier grand.

+0

Qu'est-ce que MSDN et la spécification C++ 0x ont à faire avec un objet boost? – efaj

3

L'autre réponse est correcte à propos de la norme, mais la petite est en fait un bug dans Boost 1.38, toute autre version vous permettra d'utiliser plus de godets.