对于一些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;
    }
};

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

时间: 2024-12-15 00:40:41

对于一些stl自定义比较函数的相关文章

STL自定义比较函数

调用sort函数需要加头文件<algorithm> sort函数默认的比较函数为(简化) bool comp(int a,int b){ return a<b; } 即默认排序为从小到大,如果想从大到小,只需要作如下修改 bool comp(int a,int b){ return a<b; } 调用sort函数时,显性调用comp函数,sort(begin,end,comp) 结构体自定义排序规则 有两种方法,举例说明 在结构体内重载运算符< struct temp{ in

STL 优先队列的自定义比较函数与 sort() 等泛型算法的自定义比较函数的区别

前言 最近在刷算法题,常常需要自定义比较函数作为作为函数对象送入 stl 中,遇到了下面的问题: 泛型算法 sort() 的比较函数是这么写: //sort() 实现元素间关系为递增的比较函数 struct cmp{ bool operator () (const T& a, const T& b) const { return a.x < b.x; } }; //或者这样bool operator < (const T& a, const T& b) cons

【C++】自定义比较函数小结

1.使用结构体grid作为map的key struct grid { int x; int y; }; (1)需要自定义比较函数operator<,不然会报错: error C2784: “bool std::operator <(const std::deque<_Ty,_Alloc> &,const std::deque<_Ty,_Alloc> &)”: 未能从“const grid”为“const std::deque<_Ty,_Alloc&

vector中sort用法到自定义比较函数comp

从最简单的vector中sort用法到自定义比较函数comp后对结构体排序的sort算法 sort函数在使用中非常好用,也非常简单,而且效率与冒泡或者选择排序不是一个数量级.本文就sort函数在vector中的用法分为sort函数入门用法与自定义comp比较函数比较结构体这两个最基本的功能讲讲其用法: 1.sort入门: 使用sort需要包含algorithm头文件,完整代码如下 #include<iostream> #include<vector> #include<alg

[转]LeetCode: 128 Largest Number (自定义比较函数排序)

题目: Given a list of non negative integers, arrange them such that they form the largest number. For example, given [3, 30, 34, 5, 9], the largest formed number is 9534330. Note: The result may be very large, so you need to return a string instead of

[C++]LeetCode: 128 Largest Number (自定义比较函数排序)

题目: Given a list of non negative integers, arrange them such that they form the largest number. For example, given [3, 30, 34, 5, 9], the largest formed number is 9534330. Note: The result may be very large, so you need to return a string instead of

从最简单的vector中sort用法到自定义比较函数comp后对结构体排序的sort算法

sort函数在使用中非常好用,也非常简单,而且效率与冒泡或者选择排序不是一个数量级.本文就sort函数在vector中的用法分为sort函数入门用法与自定义comp比较函数比较结构体这两个最基本的功能讲讲其用法: 1.sort入门: 使用sort需要包含algorithm头文件,完整代码如下 #include<iostream> #include<vector> #include<algorithm>//貌似可以不用,但最好加上. using namespace std

oracle 自定义比较函数

1>自定义比较函数,targetVal的值为字符串,例如:“>=90”,"2~8"等范围格式,dataVal值为字符串. create or replace function compare1(targetVal in varchar2, dataVal in varchar2) return integer is v_Result integer; dataVal_int number; targetVal_int number; v_targetVal varchar2

stl中map自定义比较函数

在stl中自定义map比较函数有两种方式,方式一在类中重载<操作符,方式二仿比较函数 1.方式一:重载<操作符 #include "stdafx.h" #include <map> #include <string> #include <iostream> using namespace std; class Key { public: Key(string name, int age) { this->name=name; thi