堆STL和重载运算符
https://www.cnblogs.com/kylara/p/9804251.html
大根堆:
1.priority_queue<int> q;【默认
2. priority_queue< node,vector<node>,less<node> > q;【自带比较函数
小根堆:
priority_queue< node,vector<node>,greater<node> > q;【自带比较函数
重载运算符:
1.定义struct node 之后重载
这是小根堆
priority_queue<node>q;//或 priority_queue< node,vector<node>,less<node> >q;
bool operator<(node a,node b)//或写做(const node &a,const, node &b) 更快
{
return a.y>b.y;//以y从小到大排序
}
2.在定义struct node时重载
struct node
{
int id,v;
bool operator<(const node &a) const{
return v<a.v;//以v从大到小排序
}
};
priority_queue<node>q;
3.定义友元操作类重载函数
struct node
{
int v;
friend bool operator<(const node &a,const node &b){
return a.v<b.v; //按v从大到小排列
}
};
priority_queue<node>q;
自定义比较函数模板结构
struct cmp
{
bool operator ()(const node &a, const node &b)
{
return a.v>b.v;// 按照v从小到大排列
}
};
priority_queue<node,vector<node>,cmp> q;
#include <iostream> #include <cstdio> #include <queue> #include <vector> using namespace std; struct node { int id,v; //id为位置,v为权值 bool operator<(const node &a) const { return v<a.v;//以v从大到小排序 } }; priority_queue<node> q; int main() { for (int i=1;i<=5;i++) { int a,b; cin>>a>>b; node temp; temp.id=a; temp.v=b; q.push(temp); } cout<<"the result is "<<endl; while (q.size()>0) { node aa; aa=q.top(); q.pop(); cout<<aa.id<<" "<<aa.v<<endl; } } /* 1 7 9 5 3 8 4 6 6 4 the result is 3 8 1 7 4 6 9 5 6 4 */
#include <iostream> #include <cstdio> #include <queue> #include <vector> using namespace std; struct node { int id,v; //id为位置,v为权值 bool operator<(const node &a) const { //保证位置编号从小到大,位置编号一样则权值从小到大
//有双关键字时一定要看下第一个关键是否相等 if (id==a.id) return v>a.v; else return id>a.id; //return v<a.v;//以v从大到小排序 } }; priority_queue<node> q; int main() { for (int i=1;i<=5;i++) { int a,b; cin>>a>>b; node temp; temp.id=a; temp.v=b; q.push(temp); } cout<<"the result is "<<endl; while (q.size()>0) { node aa; aa=q.top(); q.pop(); cout<<aa.id<<" "<<aa.v<<endl; } } /* 1 3 1 9 1 2 9 8 7 6 the result is 1 2 1 3 1 9 7 6 9 8 */