STL 優先佇列 用法

dyhaohaoxuexi發表於2019-07-26

今天做題用到了優先佇列 對它的用法還不是很熟悉 現在整理一下。

需要的庫

#include<queue>
using namespace std;

 不過我都用bits/stdc++.h...

定義

priority_queue<Type, Container, Functional>

Type是資料的型別 比如int啊char啊之類的

Container是容器型別預設是vector

Functional是比較的方式  比如greater<int>   less<int>   或者自己定義的比較函式

具體用法

基本用法1

priority_queue <int> q;

這是最基本的用法 不需要像定義一樣傳三個引數進去 只需要宣告一個資料型別即可

需要注意的是 優先佇列是預設從大到小排的!

基本用法2

//升序佇列
priority_queue <int,vector<int>,greater<int> > q;
//降序佇列
priority_queue <int,vector<int>,less<int> >q;

因為宣告瞭比較的方式,這次必須要傳三個引數進去了

需要注意的是:

  • greater<int>  和 > 之間必須要有一個空格,不然是右移運算子!
  • greater是升序排列,也就是從小到大排,不是我們想當然的greater就是從大到小!(所以這裡只需要記住 greater是升序 up up~ less是降序down down~ 這樣比較符合正常人的認知,也好記~)

進階用法1(運算子過載)

方法1 使用 friend bool operator

typedef struct node
{
    int num;
    friend bool operator < (const node & a,const node & b)
    {
        return a.num < b.num ;
    }    
}point;

 priority_queue<point>q;
 

這個方法是將運算子的過載在結構體的定義中完成,優先佇列的的定義中就不需要傳三個引數了 在這個小例子裡看起來沒什麼用 不過解決複雜問題時,就需要採用結構體來設計資料結構 也就必須要告訴計算機,比較的方式。

需要注意的是:

  • 只能對小於號進行過載
  • 若想從小到大排 只需要將return語句的小於號改成大於號即可 和sort是正好反過來的!

方法2 使用 bool operator

typedef struct node
{
        int num;
        bool operator<(const node&b)const        
        {
            return    num<b.num;
        }
}point;    

priority_queue<point>q;

和採用friend bool operator的方法1一樣,只是寫法略有不同 我不喜歡用 感覺亂亂的....

進階用法2(重寫仿函式)

struct node1 
{
    int x;
};

struct node2 
{
    bool operator() (node1 a, node1 b) 
    {
        return a.x < b.x; 
    }
};

priority_queue<node1, vector<node1>, node2> p;

重寫仿函式這個用起來真麻煩呀....需要宣告兩個結構體 不喜歡用....

支援的操作

  • top 訪問隊頭元素
  • empty 佇列是否為空
  • size 返回佇列內元素個數
  • push 插入元素到隊尾 (並排序)
  • emplace 原地構造一個元素並插入佇列
  • pop 彈出隊頭元素
  • swap 交換內容

相關文章