3

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に関する情報を表示すると、次のようになります。

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

バケットの最小数を指定するにはどうすればよいですか?

4

2 に答える 2

3

標準に関する他の回答は正しいですが、小さいのmax_bucket_countは実際には Boost 1.38 のバグです。他のバージョンでは、より多くのバケットを使用できます。

于 2009-06-22T15:08:24.070 に答える
2

boost::unordered_map::max_bucket_count()のバケット数に対する実装依存の制限を返しますunordered_map。コンストラクタ パラメータでこの制限を超えたようです。MSDN ではこれを「現在」許可されているバケットの最大数 (意味が何であれ) であると定義していますが、C++0x 仕様では、マップが持つことができるバケットの最大数であると定義していることに注意してください。

私はこのクラスを使用したことがなく、ドラフト C++0x 仕様には、コンストラクターが、あなたが指示したことを行わないオブジェクトを黙って作成している理由を説明するものは何もありません。

1572869また、大きな素数であることを除けば、 value の背後にある動機が何であるかもわかりません。

于 2009-03-29T13:48:59.787 に答える