C++ STL優先隊列常用用法

優先隊列(priority queue)
普通的隊列是一種先進先出的數據結構,元素在隊列尾追加,而從隊列頭刪除。在優先隊列中,元素被賦予優先級。當訪問元素時,具有最高優先級的元素最先刪除。優先隊列具有最高級先出 (largest-in,first-out)的行爲特徵。
STL中的優先隊列-priorit_queue,包含在頭文件”queue”中,可以使用具有默認優先級的已有數據結構;也可以再定義優先隊列的時候傳入自定義的優先級比較對象;或者使用自定義對象(數據結構),但是必須重載好< 操作符。

1.優先隊列的常用操作

        q.empty()          如果隊列爲空,則返回true,否則返回false

        q.size()           返回隊列中元素的個數

        q.pop()            刪除隊首元素,但不返回其值

        q.top()            返回具有最高優先級的元素值,但不刪除該元素

        q.push(item)       在基於優先級的適當位置插入新元素

其中q.top()爲查找操作,在最小優先隊列中搜索優先權最小的元素,在最大優先隊列中搜索優先權最大的元素。q.pop()爲刪除該元素。優先隊列插入和刪除元素的複雜度都是O(lgn),所以速度很快;另外,在優先隊列中,元素可以具有相同的優先權。
priority_queue模板原型

template< class T ,class Sequence=vector<T> ,classCompare=less<typenameSequence::value_type> >class priority_queue;

2.優先隊列常用定義和重載運算符方法

①默認優先級:

#include <queue>
using namespace std;

priority_queue<int> q; 

通過<操作符可知在整數中元素大的優先級高。

②傳入一個比較函數,使用functional.h函數對象作爲比較函數。

#include <queue>
#include <functional>
using namespace std;

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

此時整數中元素小的優先級高。

③傳入比較結構體,自定義優先級。

#include <queue>
using namespace std;

struct cmp{
    bool operator ()(int a,int b){    //通過傳入不同類型來定義不同類型優先級
        return a>b;    //最小值優先
    }
};
/**
struct cmp{
    bool operator ()(int a,int b){
        return a<b;    //最大值優先
    }
};
**/


priority_queue<int, vector<int>, cmp > q;

④自定義數據結構,自定義優先級。

#include <queue>
using namespace std;

struct node {
    int priority;
    int value;
    friend bool operator < (const node &a, const node &b) {  
        return a.priority < b.priority;
    }
    /* 這樣寫也可以
    bool operator < (const node &a) const {
        return priority < a.priority;
    }
    */

};
/**
因爲標準庫默認使用元素類型的<操作符來確定它們之間的優先級關係。而且自定義類型的<操作符與>操作符並無直接聯繫,故會編譯不過。
struct node {
    int priority;
    int value;
    friend bool operator > (const node &a, const node &b) {   //錯誤示範
        return a.priority > b.priority;  
    }
};
**/

priority_queue<node> q;
發佈了21 篇原創文章 · 獲贊 30 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章