這個是轉得網上的,由於不經常使用,偶爾用的時候還經常出錯,所以記下來了,經常使用的已經用紅色顏色標出來了 :
在優先隊列中,優先級高的元素先出隊列。
標準庫默認使用元素類型的<操作符來確定它們之間的優先級關係。
優先隊列的第一種用法,也是最常用的用法:
通過<操作符可知在整數中元素大的優先級高。
故示例1中輸出結果爲:9 6 5 3 2
第二種方法:
在示例1中,如果我們要把元素從小到大輸出怎麼辦呢?
這時我們可以傳入一個比較函數,使用functional.h函數對象作爲比較函數。
其中
第二個參數爲容器類型。
第二個參數爲比較函數。
故示例2中輸出結果爲:2 3 5 6 9
第三種方法:
自定義優先級。
{
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
但如果結構定義如下:
{
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大小從小到大排序).