我正在使用unordered_map> float,unsigned short>用C ++实现哈希表。
我知道在大多数情况下使用浮点数作为哈希表的键是个坏主意,因为比较它们容易出错。但是,在这些情况下,我正在从大文件中读取浮点数,并且它们的精度已知且不变。
但是,我想知道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
答案 0 :(得分: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*>;