1

unordered_map<float, unsigned short>C++ でハッシュ テーブルを実装するために を使用しています。

フロートをハッシュ テーブルのキーとして使用することは、ほとんどの状況で悪い考えであることはわかっています。それらを比較するとエラーが発生しやすくなるからです。ただし、このような状況では、大きなファイルから float を読み込んでおり、その精度は既知で一定です。

unordered_mapただし、衝突の頻度を推定するためにフロートをハッシュする方法の詳細を知りたいです。を作成するときに、デフォルトのハッシュ実装をオーバーライドしていませんunordered_map。ドキュメントによると、デフォルトのハッシュ関数はstd::hash<Key>. 私の場合はどれですかstd::hash<float>。しかし、ドキュメントを見ると、 「 、、、および組み込み整数型のstd::hashテンプレート引数」に対してのみ定義されています。char*const char*cropewrope

値をunordered_mapに追加するときに、値をハッシュするためにどの関数が呼び出されているか知っている人はいますか?

unordered_map- http://msdn.microsoft.com/en-us/library/bb982522.aspx

std::hash- http://www.sgi.com/tech/stl/hash.html#1

4

1 に答える 1

1

C++11 標準に従って、floatもサポートされstd::hashています。実際のハッシュ関数は実装に依存するため、現在のコンパイラの衝突頻度を把握できたとしても、新しいバージョンまたは別のコンパイラが別のハッシュ関数を実装している可能性があります。スペシャライゼーションの完全なリストは次のstd::hashとおりです。

template <> struct hash<bool>;
template <> struct hash<char>;
template <> struct hash<signed char>;
template <> struct hash<unsigned char>;
template <> struct hash<char16_t>;
template <> struct hash<char32_t>;
template <> struct hash<wchar_t>;
template <> struct hash<short>;
template <> struct hash<unsigned short>;
template <> struct hash<int>;
template <> struct hash<unsigned int>;
template <> struct hash<long>;
template <> struct hash<unsigned long>;
template <> struct hash<long long>;
template <> struct hash<unsigned long long>;
template <> struct hash<float>;
template <> struct hash<double>;
template <> struct hash<long double>;
template <class T> struct hash<T*>;
于 2011-10-13T18:08:21.770 に答える