我正在使用unordered_map<float, unsigned short>
在C ++中实现哈希表。
我知道在大多数情况下,将浮点数用作哈希表的键是一个bad想法,因为将它们进行比较容易出错。但是,在这种情况下,我正在从大型文件中读取浮点数,并且它们的精度是已知且恒定的。
但是,我想知道有关unordered_map
如何对我的浮动对象进行散列以估计碰撞频率的详细信息。创建unordered_map
时,不会覆盖默认的哈希实现。根据文档,默认哈希函数为std::hash<Key>
。在我的情况下是std::hash<float>
。但是,当我查看std::hash
文档时,仅为“ char*
,const char*
,crope
,wrope
类型和内置整数类型的模板参数定义”。
有人知道将我的值添加到unordered_map时会调用什么函数来哈希值吗?
[unordered_map
-http://msdn.microsoft.com/en-us/library/bb982522.aspx
[std::hash
-http://www.sgi.com/tech/stl/hash.html#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*>;