码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-10-10 00:26:58      浏览:31      评论:0      收藏:0      [点我收藏+]

标签:优先   哈希   stl   bool   代码   bsp      class   opera   

 

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

 

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

标签:优先   哈希   stl   bool   代码   bsp      class   opera   

原文地址:https://www.cnblogs.com/downrainsun/p/11644978.html

(0)
(0)
   
告发
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权一切 京ICP备13008772号-2
迷上了代码!