優先隊列用法:
在優先隊列中,優先級高的元素先出隊列。
標準庫默認使用元素類型的<操做符來肯定它們之間的優先級關係。
優先隊列的第一種用法,也是最經常使用的用法:node
priority_queue<int> qi;
經過<操做符可知在整數中元素大的優先級高。
故示例1中輸出結果爲:9 6 5 3 2
第二種方法:
在示例1中,若是咱們要把元素從小到大輸出怎麼辦呢?
這時咱們能夠傳入一個比較函數,使用functional.h函數對象做爲比較函數。ios
priority_queue<int, vector<int>, greater<int> >qi2;
其中
第二個參數爲容器類型。
第二個參數爲比較函數。
故示例2中輸出結果爲:2 3 5 6 9
第三種方法:
自定義優先級。函數
1 struct node 2 { 3 friend bool operator< (node n1, node n2) 4 { 5 return n1.priority < n2.priority; 6 } 7 int priority; 8 int value; 9 };
在該結構中,value爲值,priority爲優先級。
經過自定義operator<操做符來比較元素中的優先級。
在示例3中輸出結果爲:
優先級 值
9 5
8 2
6 1
2 3
1 4
但若是結構定義以下:post
1 struct node 2 { 3 friend bool operator> (node n1, node n2) 4 { 5 return n1.priority > n2.priority; 6 } 7 int priority; 8 int value; 9 };
則會編譯不過(G++編譯器)
由於標準庫默認使用元素類型的<操做符來肯定它們之間的優先級關係。
並且自定義類型的<操做符與>操做符並沒有直接聯繫,故會編譯不過。spa
固然若要按優先級從小到大輸出且要用第三中方法的話則按下面定義:code
1 struct node 2 { 3 friend bool operator< (node n1, node n2) 4 { 5 return n1.priority > n2.priority; 6 } 7 int priority; 8 int value; 9 };
輸出爲:htm
優先級 值
1 4對象
2 3blog
6 1
8 2
9 5
下面附上上面所談到的各類方法的代碼【出點三種方法的最後面從小到大排的示例~】:
1 //代碼清單 2 3 #include<iostream> 4 #include<functional> 5 #include<queue> 6 using namespace std; 7 struct node 8 { 9 friend bool operator< (node n1, node n2) 10 { 11 return n1.priority < n2.priority; 12 } 13 int priority; 14 int value; 15 }; 16 int main() 17 { 18 const int len = 5; 19 int i; 20 int a[len] = {3,5,9,6,2}; 21 //示例1 22 priority_queue<int> qi; 23 for(i = 0; i < len; i++) 24 qi.push(a[i]); 25 for(i = 0; i < len; i++) 26 { 27 cout<<qi.top()<<" "; 28 qi.pop(); 29 } 30 cout<<endl; 31 //示例2 32 priority_queue<int, vector<int>, greater<int> >qi2; 33 for(i = 0; i < len; i++) 34 qi2.push(a[i]); 35 for(i = 0; i < len; i++) 36 { 37 cout<<qi2.top()<<" "; 38 qi2.pop(); 39 } 40 cout<<endl; 41 //示例3 42 priority_queue<node> qn; 43 node b[len]; 44 b[0].priority = 6; b[0].value = 1; 45 b[1].priority = 9; b[1].value = 5; 46 b[2].priority = 2; b[2].value = 3; 47 b[3].priority = 8; b[3].value = 2; 48 b[4].priority = 1; b[4].value = 4; 49 50 for(i = 0; i < len; i++) 51 qn.push(b[i]); 52 cout<<"優先級"<<'\t'<<"值"<<endl; 53 for(i = 0; i < len; i++) 54 { 55 cout<<qn.top().priority<<'\t'<<qn.top().value<<endl; 56 qn.pop(); 57 } 58 return 0; 59 }