3 Stimmen

Angabe der Mindestanzahl von Eimern bei der Erstellung einer boost::unordered_map

Ich versuche, boost::unordered_map zu verwenden, um einige Werte zwischenzuspeichern. Ich versuche, eine Mindestanzahl von Buckets im Konstruktor anzugeben:

#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 Informationen über meine unordered_map am Ende des Programms anzeigen:

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 kann ich die Mindestanzahl der Eimer festlegen?

3voto

Daniel James Punkte 3839

Die andere Antwort ist richtig, was die Norm betrifft, aber die kleine max_bucket_count ist eigentlich ein Fehler in Boost 1.38, in jeder anderen Version können Sie mehr Buckets verwenden.

2voto

Steve Jessop Punkte 264569

boost::unordered_map::max_bucket_count() gibt die implementierungsabhängige Begrenzung der Eimeranzahl einer unordered_map . Sie scheinen diese Grenze mit Ihrem Konstruktorparameter überschritten zu haben. Beachten Sie, dass, während MSDN dies als die maximale Anzahl von Buckets definiert, die "derzeit" erlaubt sind (was auch immer das bedeutet), die C++0x-Spezifikation dies als die maximale Anzahl von Buckets definiert, die die Map jemals haben kann.

Ich habe die Klasse nie benutzt, und ich kann im Entwurf der C++0x-Spezifikation nichts finden, was erklärt, warum der Konstruktor stillschweigend ein Objekt erzeugt, das nicht das tut, was Sie ihm gesagt haben.

Ich weiß auch nicht, was die Motivation hinter dem Wert sein könnte 1572869 Ansonsten handelt es sich um eine ziemlich große Primzahl.

0 Stimmen

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X