上一篇優(yōu)先隊(duì)列實(shí)現(xiàn)講述如何使用最大堆來自己實(shí)現(xiàn)一個優(yōu)先隊(duì)列,實(shí)際上STL里面也為我們提供了相關(guān)的實(shí)現(xiàn)。下面具體來看一下STL中優(yōu)先隊(duì)列的使用方法。
基本定義
STL中定義優(yōu)先隊(duì)列的類為priority_queue,其原型如下:
template <class T, class Container = vector<T>, class Compare = less<typename Container::value_type> > class priority_queue;
模板里面有三個參數(shù),第一個為元素的類型,第二個為所使用的容器(vector或deque),第三個為一個比較的規(guī)則,決定是最大優(yōu)先隊(duì)列還是最小優(yōu)先隊(duì)列,默認(rèn)的less為最大優(yōu)先隊(duì)列。
priority_queue支持的方法和一般隊(duì)列支持的方法大體相同,主要有以下幾種方法可供使用:
bool empty() const;
size_type size() const;
const value_type& top() const;
void push (const value_type& val);
void pop();
使用方法
priority_queue的使用方式有幾種,不過在使用時(shí)都要加上queue頭文件,下面具體介紹幾種不同的使用方式。
基本數(shù)據(jù)類型
對于像int,string這樣的基本數(shù)據(jù)類型來說,其使用方式還是比較簡單的。
若是最大優(yōu)先隊(duì)列聲明為:priority_queue<int> q;
最小優(yōu)先隊(duì)列聲明:priority_queue<int, vector<int>, greater<int> > q2
int main()
{
priority_queue<int, vector<int>, greater<int> > q;
q.push(9);
q.push(5);
q.push(3);
q.push(11);
while(!q.empty())
{
int val=q.top();
cout<<val<<" ";
q.pop();
}
system("pause");
return 0;
}
上述輸出結(jié)果為3 5 9 11
,可見其為最小優(yōu)先隊(duì)列。
復(fù)合數(shù)據(jù)類型
假設(shè)你希望在優(yōu)先隊(duì)列的容器中存儲的是一個結(jié)構(gòu)體或類類型,那么如何確定元素的大小關(guān)系呢,這個時(shí)候就需要我們自己來定義比較函數(shù)了。假設(shè)我們有一個Person類,里面有名字和年齡兩個數(shù)據(jù)成員,其定義如下:
class Person
{
public:
int age;
string name;
};
我們想在優(yōu)先隊(duì)列中存儲Person類對象,可能像這樣聲明:
priority_queue< Person, vector<Person>, ??? >
但這還缺少用于比較的類型,假設(shè)我們想讓年齡來決定其優(yōu)先級,這時(shí)我們有兩種方法來自定義我們的比較類型。一種是在Person類里重載<操作符,
看起來像下面這樣:
bool operator<(const Person& lhs, const Person& rhs)
{
return lhs.age < rhs.age;
}
但這種方法只能重載<操作符,因?yàn)闃?biāo)準(zhǔn)庫中默認(rèn)使用元素類型的<操作符來確定它們之間的優(yōu)先級關(guān)系,重載>會編譯不過。這時(shí)就需要我們定義自己的比較類型,就像下面這樣:
struct LessThanByAge
{
bool operator()(const Person& lhs, const Person& rhs) const
{
return lhs.age > rhs.age;
}
};
若是第一種,使用方法直接用默認(rèn)的比較就可以了:
priority_queue<Person> pq;
第二種需要用我們自定義的比較:
priority_queue<Person, vector<Person>, LessThanByAge> pq;
索引優(yōu)先隊(duì)列
在求最短路徑的Dijkstra算法中,我們希望在優(yōu)先隊(duì)列中存儲的是頂點(diǎn)的索引v,每次從優(yōu)先隊(duì)列中需要取出的是源點(diǎn)s到各個頂點(diǎn)的最短距離disTo[v],所以決定其優(yōu)先級的是距離,這時(shí)候我們就可以使用索引優(yōu)先隊(duì)列。
我們還是要自定義比較類型,代碼如下:
//索引優(yōu)先隊(duì)列,存儲的是頂點(diǎn)索引v,比較的是disTo[v]
struct cmp
{
bool operator ()(int v1, int v2)
{
return distTo[v1] > distTo[v2]; //小值優(yōu)先
}
};
使用方式為:priority_queue<int,vector<int>,cmp> pq;
參考:https://stackoverflow.com/questions/19535644/how-to-use-the-priority-queue-stl-for-objects
感謝您的閱讀!