如果要在优先队列中进行结构体排序该怎么办?
首先定义个结构体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用于从小到大,他们的顺序取决于重载函数中的具体实现。
应该可以看出这个输出结果和上面的输出结果正好是倒序的。