std::hash
该页由英文版wiki使用Google Translate机器翻译而来。
该翻译可能存在错误或用词不当。鼠标停留在文本上可以看到原版本。你可以帮助我们修正错误或改进翻译。参见说明请点击这里. |
在头文件 <functional> 中定义
|
||
template< class Key > struct hash; // not defined |
(C++11 起) | |
哈希模板定义一个函数对象,实现了散列函数。这个函数对象的实例定义一个operator()
1。接受一个参数的类型Key
.
2。返回一个类型为size_t的值,表示该参数的哈希值.
3。调用时不会抛出异常.
4。若两个参数k1
k2
相等,则std::hash<Key>()(k1) == std::hash<Key>()(k2).
5。若两个不同的参数k1
k2
不相等,则std::hash<Key>()(k1) == std::hash<Key>()(k2)成立的概率应非常小,接近1.0/std::numeric_limits<size_t>::max().
哈希模板是CopyConstructible
和Destructible
.
的无序关联式容器std::unordered_set,std::unordered_multiset,std::unordered_map,std::unordered_multimap使用专业的模板std::hash默认的散列函数.
目录 |
[编辑] 会员类型
argument_type
|
Key
|
result_type
|
std::size_t |
[编辑] 成员函数
构造一个哈希函数对象 (公共成员函数) | |
计算哈希的说法 (公共成员函数) |
[编辑] 标准的专业基本类型
在头文件 <functional> 中定义
|
||
template<> struct hash<bool>; template<> struct hash<char>; |
||
[编辑] 标准库类型专业
(C++11) (C++11) (C++11) (C++11) |
字符串哈希支持 (类模板特化) |
(C++11) |
std::error_code的哈希支持 (类模板特化) |
(C++11) |
std::bitset的哈希支持 (类模板特化) |
(C++11) |
std::unique_ptr的哈希支持 (类模板特化) |
(C++11) |
std::shared_ptr的哈希支持 (类模板特化) |
(C++11) |
std::type_index的哈希支持 (类模板特化) |
(C++11) |
std::vector<bool>的哈希支持 (类模板特化) |
(C++11) |
std::thread::id的哈希支持 (类模板特化) |
[编辑] 的例子
演示std::string,已经有一个哈希专业化的类型的哈希计算.
Demonstrates the computation of a hash for std::string, a type that already has a hash specialization.
#include <iostream> #include <functional> #include <string> int main() { std::string str = "Meet the new boss..."; std::hash<std::string> hash_fn; size_t str_hash = hash_fn(str); std::cout << str_hash << '\n'; }
输出:
391070135
演示如何创建一个用户定义的类型的哈希函数。以此为模板参数std::unordered_map,std::unordered_set等也需要专业化的std::equal_to.
Demonstrates creation of a hash function for a user defined type. Using this as a template parameter for std::unordered_map, std::unordered_set, etc. also requires specialization of std::equal_to.
#include <iostream> #include <functional> #include <string> struct S { std::string first_name; std::string last_name; }; template<class T> class MyHash; template<> class MyHash<S> { public: size_t operator()(const S &s) const { size_t h1 = std::hash<std::string>()(s.first_name); size_t h2 = std::hash<std::string>()(s.last_name); return h1 ^ (h2 << 1); } }; int main() { std::string s1 = "Hubert"; std::string s2 = "Farnsworth"; std::hash<std::string> h1; S n1; n1.first_name = s1; n1.last_name = s2; std::cout << "hash(s1) = " << h1(s1) << "\n" << "hash(s2) = " << std::hash<std::string>()(s2) << "\n" << "hash(n1) = " << MyHash<S>()(n1) << "\n"; }
输出:
hash(s1) = 6119893563398376542 hash(s2) = 14988020022735710972 hash(n1) = 17649170831080298918
演示如何专门std::hash为用户定义的类型.
Demonstrates how to specialize std::hash for a user defined type.
#include <iostream> #include <functional> #include <string> struct S { std::string first_name; std::string last_name; }; namespace std { template<> class hash<S> { public: size_t operator()(const S &s) const { size_t h1 = std::hash<std::string>()(s.first_name); size_t h2 = std::hash<std::string>()(s.last_name); return h1 ^ ( h2 << 1 ); } }; } int main() { S s; s.first_name = "Bender"; s.last_name = "Rodriguez"; std::hash<S> hash_fn; std::cout << "hash(s) = " << hash_fn(s) << "\n"; }
输出:
hash(s) = 32902390710