对于一些stl自定义比较函数

 

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;
    }
};

 

posted @ 2019-10-09 22:53  downrainsun  阅读(431)  评论(0编辑  收藏  举报