STL之優(yōu)先隊(duì)列

上一篇優(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


感謝您的閱讀!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容