unorder_map 为什么起作用?

问题描述 投票:1回答:1

我正在使用unordered_map<float, unsigned short>在C ++中实现哈希表。

我知道在大多数情况下,将浮点数用作哈希表的键是一个bad想法,因为将它们进行比较容易出错。但是,在这种情况下,我正在从大型文件中读取浮点数,并且它们的精度是已知且恒定的。

但是,我想知道有关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

hash hashtable unordered-map
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*>;
© www.soinside.com 2019 - 2024. All rights reserved.