C++優先隊列


優先隊列的實現是一個大根堆,所以每次 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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM