priority_queue默認是大根堆,也就是大的元素會放在前面node
例如ios
#include<iostream> #include<cstdio> #include<queue> using namespace std; priority_queue<int>q; int a[15]={0,1,4,2,3,5}; const int n=5; int main() { for(int i=1;i<=n;i++) q.push(a[i]); while(q.size()!=0) printf("%d ",q.top()),q.pop(); return 0; }
它的輸出結果是函數
那如何讓priority_queue支持小根堆呢?:question:ui
將全部的數所有取負spa
這樣的話絕對值小的數會變大,絕對值大的數會變小.net
這樣就能實現小根堆了code
#include<iostream> #include<cstdio> #include<queue> using namespace std; priority_queue<int>q; int a[15]={0,1,4,2,3,5}; const int n=5; int main() { for(int i=1;i<=n;i++) q.push(-a[i]); while(q.size()!=0) printf("%d ",-q.top()),q.pop(); return 0; }
利用STL中自帶的小根堆,很簡單,只要在定義的時候寫成blog
就好get
#include<iostream> #include<cstdio> #include<queue> using namespace std; priority_queue<int,vector<int>,greater<int> >q;//這樣就能夠實現小根堆了 int a[15]={0,1,4,2,3,5}; const int n=5; int main() { for(int i=1;i<=n;i++) q.push(a[i]); while(q.size()!=0) printf("%d ",q.top()),q.pop(); return 0; }
priority_queue是支持自定義比較函數的it
#include<iostream> #include<cstdio> #include<queue> using namespace std; const int n=5; struct node { int x,y; node(){x=y=0;} node(int a,int b){x=a;y=b;} }; priority_queue<node>q; bool operator<(const node &a,const node &b) { if(a.x!=b.x)return a.x>b.x; return a.y<b.y; } int a[15]={0,1,4,4,3,5}; int b[15]={0,2,1,2,3,4}; int main() { for(int i=1;i<=n;i++) q.push(node(a[i],b[i])); while(q.size()!=0) printf("%d %d\n",q.top().x,q.top().y),q.pop(); return 0; }
注意:priority_queue自定義函數的比較與sort正好是相反的,也就是說,若是你是把大於號做爲第一關鍵字的比較方式,那麼堆頂的元素就是第一關鍵字最小的
還能夠這麼寫
#include<iostream> #include<cstdio> #include<queue> using namespace std; const int n=5; struct node { int x,y; node(){x=y=0;} node(int a,int b){x=a;y=b;} bool operator <(const node &a)const { if(a.x!=x) return a.x<x; return a.y>y; } }; priority_queue<node>q; int a[15]={0,1,4,4,3,5}; int b[15]={0,2,1,2,3,4}; int main() { for(int i=1;i<=n;i++) q.push(node(a[i],b[i])); while(q.size()!=0) printf("%d %d\n",q.top().x,q.top().y),q.pop(); return 0; }