優先隊列的實現是一個大根堆,所以每次 push(x)/pop() 操作的時間復雜度是 O(logn),log以2為底,n是該優先隊列中的元素個數
優先隊列中的元素一定要定義小於號,C++中自帶的類型 int,char 等已經定義好小於號了
http://www.luyixian.cn/news_show_13320.aspx
在圖搜索時經常 用到寬搜來求得最短路,而有這樣一類題目在求得最短路時又要使得 花費(cost可以是任意一種要求,比如改變方向的次數或者其他)最小 ,這樣每次隊列中出隊的元素就要滿足元素優先出隊。STL中的 priority_queue(優先隊列) 就可以解決這樣的問題。這樣的模板類在頭文件中,內部實現是 堆。
使用細節
優先隊列與隊列的差別在於優先隊列不是按 照入隊的順序出隊,而是按照隊列中元素的優先權順序出隊(默認為大者優先, 也可以通過指定算子來指定自己的優先順序)。
priority_queue模板類有三個模板參數,第一個是元素類型,第二個容器 類型,第三個是比較算子。其中后兩個都可以省略,默認容器為vector,默 認算子為less,即小的往前排,大的往后排(出隊時序列尾的元素出隊)。
定義priority_queue對象的示例代碼如下:
priority_queue<int> q1;
priority_queue< pair<int, int> > q2; // 注意在兩個尖括號之間 一定要留空格。
priority_queue<int, vector<int>, greater<int> > q3; // 定義小的先出隊
對於比較算子:
如果是基本數據類型,或已定義了比較運算符的類,可以直接用STL的less 算子和greater算子——默認為使用less算子,即小的往前排,大的先出隊。
如果要定義自己的比較算子,方法有多種,這里介紹其中的一種:重載比較運 算符。優先隊列試圖將兩個元素x和y代入比較運算符(對less算子,調用 x<y,對greater算子,調用x>y),若結果為真,則x排在y前面,y將先 於x出隊,反之,則將y排在x前面,x將先出隊。
簡而言之就是:對於less重載<運算符,判斷為true,將大的那方先出隊
#include <iostream> #include <deque> // 雙端隊列 #include <queue> // 單端隊列 using namespace std; struct Stu { int age; const char* name; }; struct stuless { bool operator()(const struct Stu _left,const struct Stu _right) { return _left.age < _right.age; } }; int main() { priority_queue<Stu,vector<Stu>,stuless> myPri; Stu s1 = { 33,"abcd" }; Stu s2 = { 22,"edgh" }; Stu s3 = { 24,"vin" }; Stu s4 = { 55,"vin" }; myPri.push(s1); myPri.push(s2); myPri.push(s3); myPri.push(s4); while (!myPri.empty()) { Stu tmp = myPri.top(); cout << tmp.name << ": " << tmp.age << endl; myPri.pop(); } cin.get(); return 0; }