今天做題用到了優先佇列 對它的用法還不是很熟悉 現在整理一下。
需要的庫
#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 交換內容