優先隊列(priority queue)
普通的隊列是一種先進先出的數據結構,元素在隊列尾追加,而從隊列頭刪除。在優先隊列中,元素被賦予優先級。當訪問元素時,具有最高優先級的元素最先刪除。優先隊列具有最高級先出 (largest-in,first-out)的行爲特徵。
STL中的優先隊列-priorit_queue,包含在頭文件”queue”中,可以使用具有默認優先級的已有數據結構;也可以再定義優先隊列的時候傳入自定義的優先級比較對象;或者使用自定義對象(數據結構),但是必須重載好< 操作符。
1.優先隊列的常用操作
q.empty() 如果隊列爲空,則返回true,否則返回false
q.size() 返回隊列中元素的個數
q.pop() 刪除隊首元素,但不返回其值
q.top() 返回具有最高優先級的元素值,但不刪除該元素
q.push(item) 在基於優先級的適當位置插入新元素
其中q.top()爲查找操作,在最小優先隊列中搜索優先權最小的元素,在最大優先隊列中搜索優先權最大的元素。q.pop()爲刪除該元素。優先隊列插入和刪除元素的複雜度都是O(lgn),所以速度很快;另外,在優先隊列中,元素可以具有相同的優先權。
priority_queue模板原型
template< class T ,class Sequence=vector<T> ,classCompare=less<typenameSequence::value_type> >class priority_queue;
2.優先隊列常用定義和重載運算符方法
①默認優先級:
#include <queue>
using namespace std;
priority_queue<int> q;
通過<操作符可知在整數中元素大的優先級高。
②傳入一個比較函數,使用functional.h函數對象作爲比較函數。
#include <queue>
#include <functional>
using namespace std;
priority_queue<int, vector<int>, greater<int> > q;
此時整數中元素小的優先級高。
③傳入比較結構體,自定義優先級。
#include <queue>
using namespace std;
struct cmp{
bool operator ()(int a,int b){ //通過傳入不同類型來定義不同類型優先級
return a>b; //最小值優先
}
};
/**
struct cmp{
bool operator ()(int a,int b){
return a<b; //最大值優先
}
};
**/
priority_queue<int, vector<int>, cmp > q;
④自定義數據結構,自定義優先級。
#include <queue>
using namespace std;
struct node {
int priority;
int value;
friend bool operator < (const node &a, const node &b) {
return a.priority < b.priority;
}
/* 這樣寫也可以
bool operator < (const node &a) const {
return priority < a.priority;
}
*/
};
/**
因爲標準庫默認使用元素類型的<操作符來確定它們之間的優先級關係。而且自定義類型的<操作符與>操作符並無直接聯繫,故會編譯不過。
struct node {
int priority;
int value;
friend bool operator > (const node &a, const node &b) { //錯誤示範
return a.priority > b.priority;
}
};
**/
priority_queue<node> q;