轉載:
1.優先隊列priority_queue 用法詳解
2.STL系列之五 priority_queue 優先級隊列
優先隊列是隊列的一種,不過它可以按照自定義的一種方式(數據的優先級)來對隊列中的數據進行動態的排序
每次的push和pop操作,隊列都會動態的調整,以達到我們預期的方式來存儲。
例如:我們常用的操作就是對數據排序,優先隊列默認的是數據大的優先級高
所以我們無論按照什么順序push一堆數,最終在隊列里總是top出最大的元素。
用法:
示例:將元素5,3,2,4,6依次push到優先隊列中,print其輸出。
1。標準庫默認使用元素類型的<操作符來確定它們之間的優先級關系。
priority_queue pq;
通過<操作符可知在整數中元素大的優先級高。
故示例1中輸出結果為: 6 5 4 3 2
2。數據越小,優先級越高
priority_queue<int, vector<int>, greater<int> >pq;
其中
第二個參數為容器類型。
第二個參數為比較函數。
故示例2中輸出結果為:2 3 4 5 6
3.自定義優先級,重載比較符號
重載默認的 < 符號
struct node
{friend bool operator< (node n1, node n2){return n1.priority < n2.priority;}int priority;int value;
};
這時,需要為每個元素自定義一個優先級。
注:重載>號會編譯出錯,因為標準庫默認使用元素類型的<操作符來確定它們之間的優先級關系。
而且自定義類型的<操作符與>操作符并無直接聯系
代碼:
#include<iostream>
#include<functional>
#include<queue>
using Namespace stdnamespace std;
struct node
{friend bool operator< (node n1, node n2){return n1.priority < n2.priority;}int priority;int value;
};
int main()
{const int len = 5;int i;int a[len] = {3,5,9,6,2};//示例1priority_queue<int> qi;for(i = 0; i < len; i++)qi.push(a[i]);for(i = 0; i < len; i++){cout<<qi.top()<<" ";qi.pop();}cout<<endl;//示例2priority_queue<int, vector<int>, greater<int> >qi2;for(i = 0; i < len; i++)qi2.push(a[i]);for(i = 0; i < len; i++){cout<<qi2.top()<<" ";qi2.pop();}cout<<endl;//示例3priority_queue<node> qn;node b[len];b[0].priority = 6; b[0].value = 1; b[1].priority = 9; b[1].value = 5; b[2].priority = 2; b[2].value = 3; b[3].priority = 8; b[3].value = 2; b[4].priority = 1; b[4].value = 4; for(i = 0; i < len; i++)qn.push(b[i]);cout<<"優先級"<<'\t'<<"值"<<endl;for(i = 0; i < len; i++){cout<<qn.top().priority<<'\t'<<qn.top().value<<endl;qn.pop();}return 0;
}
priority_queue函數列表
c.top() 返回隊列頭部數據
c.push(elem) 在隊列尾部增加elem數據
c.pop() 隊列頭部數據出隊
其它操作
c.empty() 判斷隊列是否為空
c.size()
返回隊列中數據的個數
可以看出priority_queue的函數列表與棧stack的函數列表是相同的。