STL 優先隊列 用法

今天作題用到了優先隊列 對它的用法還不是很熟悉 如今整理一下。node

須要的庫

#include<queue>
using namespace std;

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

定義

priority_queue<Type, Container, Functional>數據結構

Type是數據的類型 好比int啊char啊之類的less

Container是容器類型默認是vector函數

Functional是比較的方式  好比greater<int>   less<int>   或者本身定義的比較函數spa

具體用法

基本用法1

priority_queue <int> q;

這是最基本的用法 不須要像定義同樣傳三個參數進去 只須要聲明一個數據類型便可設計

須要注意的是 優先隊列是默認從大到小排的!code

基本用法2

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

由於聲明瞭比較的方式,此次必需要傳三個參數進去了blog

須要注意的是:排序

  • 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 交換內容
相關文章
相關標籤/搜索