结构体优先级设置-内嵌比较函数写法

涉及到结构体排序时,就需要写比较函数设置结构体的优先级(priority_queue、sort、map、set)

1、普通比较函数cmp

//作为普通函数重载

struct node
{
    double y,lx,rx;
    int val;
}line[manx];
bool cmp(node a,node b)
{
    return a.y<b.y;
}

使用:

sort(line,line+n,cmp);

2、结构体内嵌比较函数(写法1)

//作为友元函数重载

struct node
{
    double y,lx,rx;
    int val;
    friend bool operator<(node a,node b)//重载小于号“<”
    {
        return a.y<b.y;//y大的优先级高
    }
}line[manx];

或:

struct node
{
    double y,lx,rx;
    int val;
}line[manx<<1];
 bool operator<(node a,node b)
{
    return a.y<b.y;
}

使用:

sort(line,line+n);
priority_queue<node>qu;

注:当结构体内数据较为庞大时,建议用引用来提高效率,即比较类的参数中加上const和&(取引用时,不用复制这个结构体或者这个类,加快了速度)

friend bool operator<(const node &a,const node &b)

bool operator()(const node &a,const node &b)
3、结构体内嵌比较函数(写法2)

//作为成员函数重载
//前面三种写法的区别就是可以访问的类成员变量不同,涉及到c++面向对象的内容

struct node
{
    double y,lx,rx;
    int val;
    bool operator<(node &b)const
    {
        return y<b.y;
    }
}line[manx];

使用(同2):

sort(line,line+n);
priority_queue<node>qu;

4、用struct包装一个cmp函数(写法3)
struct node
{
    double y,lx,rx;
    int val;
} line[manx];
struct cmp
{
    bool operator()(node a,node b)
    {
        return a.y>b.y;
    }
};

使用:

sort(line,line+n,cmp());
priority_queue<node,vector<node>,cmp>qu;

附1:基本数据类型的优先级设置(int、double、char等)

less< int >表示数字大的有优先级越大,greater< int >相反

这两种定义时等价的

priority_queue<int>qu;
priority_queue<int,vector<int>,less<int> >qu;

如果想让优先队列总是把最小的元素放队首,则定义如下

priority_queue<int,vector<int>,greater<int> >qu;
附2: 重载*号

C++的运算符重载


mat operator *(const mat &x,const mat &y)//重载运算符
{
    mat ans=init;
    for(int i=0; i<m; i++)
        for(int j=0; j<m; j++)
            for(int k=0; k<m; k++)
                ans.a[i][j]=(x.a[i][k]*y.a[k][j]%mod+ans.a[i][j])%mod;
    return ans;
}

现在A,B两个矩阵就可以直接相乘了===>A*B

priority_queue是一种数据结构,它类似于队列(queue),但每次出列的是整个队列中的最小或最大元素。它的定义可以有多种形式,其中常见的是priority_queue<Type>和priority_queue<Type, Container, Functional>。 在定义priority_queue时,可以指定元素的类型(Type),以及容器类型(Container)和比较函数(Functional)。比如,priority_queue<int, vector<int>, greater<int>>是一个升序队列,而priority_queue<int, vector<int>, less<int>>是一个降序队列。 与一般队列相比,优先队列的函数接口是一致的,只是在出列时会根据元素的优先级进行排序。它可以实现基于数组二叉堆的优先队列。 所以,priority_queue可以看作是一种特殊的队列数据结构,它可以按照特定的排序规则对元素进行排序,并在出列时返回最小或最大的元素。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [【总结】C++ 基础数据结构 —— STL之优先队列(priority_queue) 用法详解](https://blog.csdn.net/weixin_44668898/article/details/102132580)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [优先队列(priority_queue)的C语言实现代码](https://download.csdn.net/download/weixin_38730767/13989391)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值