自定义类型:
struct my_key {
int num;
string name;
};
1、由于unordered_map是采用哈希实现的,对于系统的类型int, string等,都已经定义好了hash函数,所以如果我们引入新的自定义类型的话,系统并不知道如何去计算我们引入的自定义类型的hash值,所以我们就需要自己定义hash函数,告诉系统用这种方式去计算我们引入的自定义类型的hash值
自定义的hash函数如下:
struct myHashFuc
{
std::size_t operator()(const my_key &key) const
{
return std::hash<int>()(key.num);
}
};
由于我们的结构中有int和string,所以此处直接采用系统的int的哈希做法即可
2、重载==号
除了自定义哈希函数外
系统计算了hash值后,还需要判断是否冲突,对于默认的类型,系统都知道怎样去判断是否相等,但不知道怎样去判断我们引入的自定义类型是否相等,所以需要我们重载==号,告诉系统用这种方式去判断2个键是否相等
struct my_key {
int num;
string name;
my_key(){}
~my_key(){}
my_key(int a, string b) : num(a), name(b){}
//重载==号
bool operator==(const my_key &t)const {
return this->num == t.num;
}
};
做完上面2步,我们就可以使用自定义类型的键的unordered_map啦
完整代码如下:
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
struct my_key {
int num;
string name;
my_key(){}
~my_key(){}
my_key(int a, string b) : num(a), name(b){}
bool operator==(const my_key &t)const {
return this->num == t.num;
}
};
struct myHashFuc
{
std::size_t operator()(const my_key &key) const
{
return std::hash<int>()(key.num);
}
};
int main()
{
unordered_map <my_key, bool, myHashFuc> mmp;
my_key myuin(1, "bob");
mmp[myuin] = true;
cout << mmp[myuin] << endl;
return 0;
}