1.unorderd_map自定义键
自定义类型
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; }
2.优先队列自定义比较函数
优先队列默认是大根堆,大的先出来。
所以下面这个数据类型放在优先队列是大的先出来。
priority_queue<comp> pq; struct comp { int x; bool operator < (const comp& n) const { if(x % 3 == n.x % 3) return x < n.x; return x%3 < n.x%3; } };