2009-03-29 3 views
3

Ich versuche, boost :: unordered_map zu verwenden, um einige Werte zwischenzuspeichern. Ich versuche, minimale Anzahl von Eimern im Konstruktor angeben:Geben Sie die Mindestanzahl von Buckets an, wenn Sie einen Boost erstellen :: 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> >()); 

Aber wenn ich Anzeige von Informationen über meine unordered_map am Ende des Programms:

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 

Wie lege ich die Mindestanzahl von Buckets fest?

Antwort

2

boost::unordered_map::max_bucket_count() gibt den implementierungsabhängigen Grenzwert für die Bucket-Anzahl eines unordered_map zurück. Sie scheinen dieses Limit mit Ihrem Konstruktorparameter überschritten zu haben. Beachten Sie, dass, während MSDN dies als die maximal zulässigen Buckets definiert (was auch immer das bedeutet), die C++ 0x-Spezifikation es als die meisten Buckets definiert, die die Map jemals haben kann.

Ich habe nie die Klasse verwendet, und ich kann nichts in der Entwurf C++ 0x-Spezifikation sehen, um zu erklären, warum der Konstruktor im Hintergrund ein Objekt erstellt, das nicht das tut, was Sie ihm gesagt haben.

Ich weiß auch nicht, was die Motivation hinter dem Wert 1572869 sein könnte, abgesehen davon, dass es eine große Primzahl ist.

+0

Was haben MSDN und die C++ 0x-Spezifikation mit einem Boost-Objekt zu tun? – efaj

3

Die andere Antwort ist korrekt über den Standard, aber die kleine max_bucket_count ist eigentlich ein Bug in Boost 1.38, jede andere Version können Sie mehr Buckets verwenden.

Verwandte Themen