priority_queue<int,vector<int>,greater<int> > q; //小根堆
priority_queue<int,vector<int>,less<int> > q; //大根堆,等价于priority_queue<int> q
大根堆就是把大的元素放在堆顶的堆。小根堆就是把小的元素放在堆顶的堆。
注意,当我们声明的时候碰到两个"<“或者”>"放在一起的时候,一定要记得在中间加一个空格。这样编译器才不会把两个连在一起的符号判断成位运算的左移/右移。
sort自定义的排列顺序与优先队列的相反。(
运行代码可以更直观感受sort与优先队列的不同)
优先队列自定义顺序的三种方式
#include<bits/stdc++.h>
using namespace std;
struct pp{
int a;
int b;
bool operator< (const pp &b) const{
return a<b.a;
} //直接重载
};
priority_queue<pp> q;
int main()
{
pp t[5];
int n;
cin>>n;
for(int i=1;i<=n;i++)
{cin>>t[i].a;q.push(t[i]);}
sort(t+1,t+1+n);
for(int i=1;i<=n;i++) cout<<t[i].a<<' ';
cout<<endl;
while(!q.empty())
{
cout<<q.top().a<<' ';
q.pop();
}
}
#include<bits/stdc++.h>
using namespace std;
struct pp{
int a;
int b;
friend operator< (pp a,pp b) {
return a.a<b.a;
}//用friend进行自定义
};
priority_queue<pp> q;
int main()
{
pp t[5];
int n;
cin>>n;
for(int i=1;i<=n;i++)
{cin>>t[i].a;q.push(t[i]);}
sort(t+1,t+1+n);
for(int i=1;i<=n;i++) cout<<t[i].a<<' ';
cout<<endl;
while(!q.empty())
{
cout<<q.top().a<<' ';
q.pop();
}
}
#include<bits/stdc++.h>
using namespace std;
struct pp{
int a;
int b;
};
bool tmp (pp a,pp b) {
return a.a>b.a;
}
priority_queue<pp,vector<pp>,function<bool(pp,pp)>> q(tmp);//用function自定义顺序
int main()
{
pp t[5];
int n;
cin>>n;
for(int i=1;i<=n;i++)
{cin>>t[i].a;q.push(t[i]);}
while(!q.empty())
{
cout<<q.top().a<<' ';
q.pop();
}
sort(t+1,t+1+n,tmp);
cout<<endl;
for(int i=1;i<=n;i++) cout<<t[i].a<<" ";
}