1、重载运算符<
struct node
{
int dat;
friend bool operator<(node a,node b)
{
return a.dat>b.dat;
}
};
int main()
{
int n,m;
while (cin>>n>>m)
{
priority_queue<node> q;
int data;
for(int i=0;i<n;i++)
{
string str;
cin>>str;
if(str=="I")
{
cin>>data;
node no;
no.dat=data;
q.push(no);
if(q.size()>m)
q.pop();
}
else if(str=="Q")
{
cout<<q.top().dat<<endl;
}
}
}
return 0;
}
在上面的代码中我们声明的优先队列是升序的,与以往相反,在此处node中重载了运算符<,之前一直不理解升序降序的规则。
friend bool operator<(node a,node b)
{
return a.dat>b.dat;
}
我们的参数为a,b 正常的小于应该是a<b,也就是a.dat<b.dat 这样的优先队列是正常的降序,但是我们想得到相反的结果应该a.dat>b.dat。
2、sort中的cmp()函数
#include <iostream>
#include<queue>
#include<string>
#include<algorithm>
using namespace std;
struct node
{
int dat;
};
bool cmp(node a,node b)
{
return a.dat <b.dat;//升序
}
int main()
{
node a[5];
for (int i = 1; i <= 5; i++)
a[i - 1].dat = i;
sort(a, a + 5, cmp);
for (int i = 1; i <= 5; i++)
cout<<a[i - 1].dat << endl;
return 0;
}
运行结果按升序排序:
image.png
其中关键代码个人理解如下:
bool cmp(node a,node b)
{
return a.dat <b.dat;//升序
}
两个节点a,b 当a<b时返回true,意味着要求a<b,这样假设数组中的数是a、b、c、d、e时,当a<b<c<d<e时才满足cmp规则true,这样是升序序列。