标签:map set hash h2 auto h1 unordered
如何实现组合关键字的unordered_set/unordered_map
在VC编译器中,使用unordered_set或unordered_map时,如果需要将多个选项作为关键字进行hash,例如将学生信息中的学号和姓名相结合标记,应该如何实现呢?
STL库中提供了强大的hash function,该函数可以将数据进行hash,并将多个选项进行整合得到一个hash关键字,其实现如下。
#include <string>
#include <unordered_set>
#include <functional>
class hash_combine1{ // 这是一个仿函数,即重载了()操作符,可实现类似函数的操作的一种类型
public:
size_t operator()(const pair<string, int>&a) const{ // 两处const必须加
auto h1 = hash<string>()(a.first);
auto h2 = hash<int>()(a.second);
return h1 ^ h2; // 此处的操作可以自定义
}
};
size_t hash_combine2(pair<string, int>& a){
auto h1 = hash<string>()(a.first);
auto h2 = hash<int>()(a.second);
return h1 ^ h2;
}
int main()
{
unordered_set<pair<string, int>, hash_combine1>tab1;
tab1.insert({"123", 1});
tab1.emplace("124", 2); // 使用emplace会自动调用其构造函数
// 省去了拷贝构造的过程,效率更高
// unordered_set<pair<string, int>, hash_combine2>tab2; // 错误,传递的必须是仿函数
// 即传递一个类型名
// tab2.emplace("345", 2);
return 0;
}
其中的hash()模板函数具体实现不同编译器有所差异,可以打开function_hash.h文件查看。
标签:map,set,hash,h2,auto,h1,unordered 来源: https://blog.csdn.net/Clark_Sev/article/details/117019137
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。