C++:优先队列priority_queue使用自定义排序函数

如果要在优先队列中进行结构体排序该怎么办?

首先定义个结构体A

typedef struct A
{
    int l;
    int r;
    int label;
}a;

接下来就可以定义优先队列,容器中的元素是结构体A

#include <queue>
priority_queue<a, vector<a>, greater<a> > que1;
priority_queue<a, vector<a>, less<a> > que2;

优先队列里面的greater和less是针对标准数据类型来的,greater是从小到大,less是从大到小

优先队列里面默认是从大到小排序

我们如果要按照结构体A中的r的大小进行排序,就需要重载运算符:

bool operator < (A a1, A a2){
	return a1.r < a2.r;
}

bool operator > (A a1, A a2){
	return a1.l > a2.l;
}

其中:

  • 大于号 > 的重载对应了greater的重载,是根据重载规则从小到大排序
  • 小于号 < 的重载对应了less的重载,是根据重载规则从大到小排序

例子:

#include <iostream>
#include <queue>
using namespace std;

typedef struct _A
{
	int l;
	int r;
	int label;
}A;

bool operator < (A a1, A a2){
	return a1.r < a2.r;
}

bool operator > (A a1, A a2){
	return a1.l > a2.l;
}

priority_queue<A, vector<A>, greater<A> > que1;		// 递增 - 对应>
priority_queue<A, vector<A>, less<A> > que2;		// 递减 - 对应<


int main()
{

        //  l  r  label
    A a1 = {1, 2, 1};
    A a2 = {6, 7, 2};
    A a3 = {3, 5, 3};
    A a4 = {2, 3, 4};
    A a5 = {4, 10, 5};
    que1.push(a1);
    que1.push(a2);
    que1.push(a3);
    que1.push(a4);
    que1.push(a5);
    que2.push(a1);
    que2.push(a2);
    que2.push(a3);
    que2.push(a4);
    que2.push(a5);
    cout << "按照l递增:";
    while(!que1.empty()){
    	cout << "a" << que1.top().label << "<";
    	que1.pop();
    }
    cout << endl;
    cout << "按照r递减:";
    while(!que2.empty()){
        cout << "a" << que2.top().label << ">";
        que2.pop();
    }
    cout << endl;
    return 0;
}

输出:

按照l递增:a1<a4<a3<a5<a2

按照r递减:a5>a2>a3>a4>a1

继续探讨:

如果我在重载对应greater的大于符号的时候,返回的是小于的判定结论,结果如何?

bool operator > (A a1, A a2){
	return a1.l < a2.l;
}

对称地,如果在重载对应less的小于符号的时候返回的是大于的判定结论:

bool operator < (A a1, A a2){
	return a1.r > a2.r;
}

最终的结果:

按照l递增:a2<a5<a3<a4<a1

按照r递减:a1>a4>a3>a2>a5

当然了,上面的大于和小于关系是不正确的,此时按照l应该是个递减的顺序,按照r应该是递增的顺序,也就是相反的结果,greater用于从大到小,less用于从小到大,他们的顺序取决于重载函数中的具体实现。

应该可以看出这个输出结果和上面的输出结果正好是倒序的。

  • 12
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值