unordered_map <float,short =“”>为什么这有用?</float,>

时间:2011-10-13 18:01:31

标签: hash hashtable unordered-map

我正在使用unordered_map&gt; float,unsigned short&gt;用C ++实现哈希表。

我知道在大多数情况下使用浮点数作为哈希表的键是个坏主意,因为比较它们容易出错。但是,在这些情况下,我正在从大文件中读取浮点数,并且它们的精度已知且不变。

但是,我想知道unordered_map如何散列我的浮点数以便估计碰撞频率的细节。在创建无序映射时,我没有覆盖默认的哈希实现。根据文档,默认的哈希函数是std :: hash&gt; Key&gt;。在我的例子中是std :: hash&gt; float&gt;。但是,当我查看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

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*>;