priority_queue優先隊列使用

這個是轉得網上的,由於不經常使用,偶爾用的時候還經常出錯,所以記下來了,經常使用的已經用紅色顏色標出來了 :

在優先隊列中,優先級高的元素先出隊列。
標準庫默認使用元素類型的<操作符來確定它們之間的優先級關係。
優先隊列的第一種用法,也是最常用的用法:

priority_queue<int> qi;

通過<操作符可知在整數中元素大的優先級高。
故示例1中輸出結果爲:9 6 5 3 2

第二種方法:
在示例1中,如果我們要把元素從小到大輸出怎麼辦呢?
這時我們可以傳入一個比較函數,使用functional.h函數對象作爲比較函數。

priority_queue<int, vector<int>, greater<int> >qi2;

其中
第二個參數爲容器類型。
第二個參數爲比較函數。
故示例2中輸出結果爲:2 3 5 6 9

第三種方法:
自定義優先級。

struct node
{
    friend bool operator< (node n1, node n2)
    {
        return n1.priority < n2.priority;
    }
    int priority;
    int value;
};

在該結構中,value爲值,priority爲優先級。
通過自定義operator<操作符來比較元素中的優先級。
在示例3中輸出結果爲:
優先級  值
9          5
8          2
6          1
2          3
1          4
但如果結構定義如下:

struct node
{
   
friend bool operator> (node n1, node n2)
    {
       
return n1.priority > n2.priority;
    }
   
int priority;
   
int value;
};

則會編譯不過(G++編譯器)
因爲標準庫默認使用元素類型的<操作符來確定它們之間的優先級關係。
而且自定義類型的<操作符與>操作符並無直接聯繫,故會編譯不過。

補充的一點是:

我們可以自己寫一個比較類,還設定優先級:

struct cmp
{
    bool operator() (const int &a, const int &b)
    {
        return dist[a] > dist[b];
    }
};

priority_queue<int,vector<int>,cmp> q;(按照元素的dist大小從小到大排序).

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章