STL之優先佇列priority queue

2021-07-11 13:45:22 字數 3145 閱讀 2206

stl

之優先佇列

原本以為

priority_queue

很簡單,才知道原來懂的只是最簡單的形式。

標頭檔案:

#include

#include 

auto comp = (pair&a, pair&b) ;

priority_queue, vector>, decltype(comp)> temp(comp);

struct comp 

};priority_queue, comp> res;

優先佇列,也就是原來我們學過的堆,按照自己定義的優先順序出隊時。預設情況下底層是以

vector

實現的heap

。既然是佇列,也就只有入隊、出隊、判空、大小的操作,並不具備查詢功能。

函式列表:

empty() 

如果優先隊列為空,則返回真

pop() 

刪除第乙個元素

push() 

加入乙個元素

size() 

返回優先佇列中擁有的元素的個數

top() 

返回優先佇列中有最高優先順序的元素

用途就不用多說了吧,例如

huffman

編碼、分支限界、

a*啟發式都需要用到優先佇列存放資訊。

來看最常用的幾個功能,了解一下其中的知識點:

一:最基本的功能

#include

#include

using namespace std;

int main()

system("pause");

return 0;

}優先佇列最基本的功能就是出隊時不是按照先進先出的規則,而是按照佇列中優先順序順序出隊。

知識點:

1、一般存放實型型別,可比較大小

2、預設情況下底層以

vector實現3

、預設情況下是大頂堆,也就是大者優先順序高,後面可以自定義優先順序比較規則

二:次基本的功能

#include

#include

using namespace std;

int main()

;priority_queueq(a,a+5);

while(!q.empty())

system("pause");

return 0;

}可以將乙個存放實型型別的資料結構轉化為優先佇列,這裡跟優先佇列的建構函式相關。

上面那個預設構造乙個空的優先佇列,什麼都使用預設的。

而這裡使用的是

priority_queue(inputiteratorfirst,inputiterator last)

我理解的就是給出了乙個容器的開口和結尾,然後把這個容器內容拷貝到底層實現(預設

vector)

中去構造出優先佇列。這裡也使用了乙個預設的比較函式,也是預設大頂堆

三應該掌握的功能:

#include

#include

using namespace std;

typedef pairnode;

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

這個裡面定義了乙個制定存放元素

(node),

底層實現以

vector

實現(第二個引數)

,優先順序為小頂堆

(第三個引數)。

前兩個引數沒什麼說的,很好理解,其中第三個引數,預設有三寫法:

小頂堆:

greater

大頂堆:

less

如果想自定義優先順序而

type

不是基本型別,而是複雜型別,例如結構體、類物件,則必須過載其中的

operator()

,見下面的例子。

例子:#include

#include

using namespace std;

//模擬存放節點資訊

typedef struct

node;

//自定義優先順序型別

struct cmp

};int main()

//定義優先佇列

,自定義優先順序,跟

qsort

裡面自定義相似

priority_queue,cmp> q(arr,arr+n);

while(!q.empty())

system("pause");

return 0;}

乙個例題就是ugly number

-------------------------------------------

ugly numbers are numbers whose only prime factors are 2, 3 or 5. the sequence

1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, ...

shows the first 11 ugly numbers. by convention, 1 is included.

write a program to find and print the 1500'th ugly number.

**乙個人寫的使用優先佇列解決的**

#include 

#include
using namespace std;
typedef pairnode_type;
main()
result[i] = node.first;
}
int n;
cin >> n;
while (n>0)
return 1;
}
vectortopkfrequent(vector& nums, int k) 

vectorres;

for(auto & i : counts)

return res;

}

STL之優先佇列

stl 中優先佇列的使用方法 priority queu 基本操作 empty 如果隊列為空返回真 pop 刪除對頂元素 push 加入乙個元素 size 返回優先佇列中擁有的元素個數 top 返回優先佇列對頂元素 在預設的優先佇列中,優先順序高的先出隊。在預設的int型中先出隊的為較大的數。使用方...

STL容器之優先佇列

優先順序佇列,以前刷題的時候用的比較熟,現在竟然我只能記得它的關鍵字是priority queue 太傷了 在一些定義了權重的地方這個資料結構是很有用的。先回顧佇列的定義 佇列 queue 維護了一組物件,進入佇列的物件被放置在尾部,下乙個被取出的元素則取自佇列的首部。priority queue特...

STL容器之優先佇列

參考 拼裝小火車 要學會如何定義最小優先佇列 最大優先佇列 對於自己定義的結構體,如何定義最小 最大優先佇列 核心 定義比較結構 struct cmp1 struct cmp2 自定義資料結構 struct number1 struct number2 priority queue que 採用預設...