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

时间:2025-04-04 08:11:08

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

首先定义个结构体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  < ;
}

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

其中:

  • 大于号 > 的重载对应了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  < ;
}

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

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};
    (a1);
    (a2);
    (a3);
    (a4);
    (a5);
    (a1);
    (a2);
    (a3);
    (a4);
    (a5);
    cout << "按照l递增:";
    while(!()){
    	cout << "a" << ().label << "<";
    	();
    }
    cout << endl;
    cout << "按照r递减:";
    while(!()){
        cout << "a" << ().label << ">";
        ();
    }
    cout << endl;
    return 0;
}

输出:

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

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

继续探讨:

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

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

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

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

最终的结果:

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

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

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

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