優先佇列priority queue的使用方法

2021-07-11 21:57:39 字數 3810 閱讀 6565

以下內容摘自

priority_queue 優先順序佇列是乙個擁有權值概念的單向佇列queue,在這個佇列中,所有元素是按優先順序排列的(也可以認為queue是個按進入佇列的先後做為優先順序的優先順序佇列——先進入佇列的元素優先權要高於後進入佇列的元素)。在計算機作業系統中,優先順序佇列的使用是相當頻繁的,進執行緒排程都會用到。在stl的具體實現中,priority_queue也是以別的容器作為底部結構,再根據堆的處理規則來調整元素之間的位置。下面給出priority_queue的函式列表和vs2008中priority_queue的源**,本文中與heap有關的函式參見《stl系列之四 heap 堆》。

priority_queue函式列表 函式

描述      by morewindows( 

)構造析構

priority_queue c

建立乙個空的queue 。

注:priority_queue建構函式有7個版本,請查閱msdn

資料訪問與增減

c.top()

返回佇列頭部資料

c.push(elem)

在佇列尾部增加elem資料

c.pop()

佇列頭部資料出隊

其它操作

c.empty()

判斷佇列是否為空

c.size()

返回佇列中資料的個數

可以看出priority_queue的函式列表與棧

stack

的函式列表是相同的。

vs2008中priority_queue 優先順序佇列的源**

[cpp]view plain

copy

//vs2008中 priority_queue的定義 morewindows整理(  )

template

<

class

_ty, 

class

_container = vector<_ty>, 

class

_pr = less<

typename

_container::value_type> > 

//預設以vector為容器的

class

priority_queue  

explicit

priority_queue(

const

_pr& _pred) : c(), comp(_pred)  

priority_queue(const

_pr& _pred, 

const

_container& _cont) : c(_cont), comp(_pred)  

template

<

class

_iter>  

priority_queue(_iter _first, _iter _last) : c(_first, _last), comp()  

template

<

class

_iter>  

priority_queue(_iter _first, _iter _last, const

_pr& _pred) : c(_first, _last), comp(_pred)  

template

<

class

_iter>  

priority_queue(_iter _first, _iter _last, const

_pr& _pred, 

const

_container& _cont) : c(_cont), comp(_pred)  

bool

empty() 

const

size_type size() const

const_reference top() const

reference top()  

void

push(

const

value_type& _pred)  

void

pop()  

protected

:  _container c;   // the underlying container

_pr comp;   // the comparator functor

};  

下面先給出優級先級佇列的使用範例。

[cpp]view plain

copy

//優先順序佇列 priority_queue by morewindows(  )

// 支援 empty() size() top() push() pop() 與stack的操作函式全部一樣

//by morewindows

#include 

#include 

#include 

using

namespace

std;  

intmain()  

//優先順序佇列的大小

printf("%d\n"

, a.size());  

//取優先順序佇列資料並將資料移出佇列

while

(!a.empty())  

putchar('\n'

);  

return

0;  

}  

下面程式是針對結構體的,對資料的比較是通過對結構體重載operator()。

程式功能是模擬排隊過程,每人有姓名和優先順序,優先順序相同則比較姓名,開始有5個人進入佇列,然後隊頭2個人出隊,再有3個人進入佇列,最後所有人都依次出隊,程式會輸出離開隊伍的順序。

[cpp]view plain

copy

//by morewindows(  )

#include 

#include 

#include 

using

namespace

std;  

//結構體

struct

node  

};  

//結構體的比較方法 改寫operator()

struct

nodecmp  

};  

void

printfnode(node &na)  

intmain()  

return

0;  

}   簡單來說,優先佇列有如下使用方法

構建乙個 內建型別 /具有operator < 的優先佇列

priority_queuequeue; 

其中type必須有operator <, 否則將引起編譯錯誤。另外,如果以成員函式過載operator <,需要注意this與傳入相同的問題。友元過載就沒有這個問題。

構建乙個 自定義演算法的 優先佇列

priority_queue,typecmp> queue;

其中vector是優先佇列內部使用的容器,建議使用vector. typecmp是乙個類(或結構體)過載()形成仿函式形式

struct typecmp

bool operator() (const type& a,const type& b);

如果typecmp()呼叫了type的私有資料域,那麼type的定義中相應的應該加上friend typecmp;

(由於仿函式和lambda的相似性我又寫了個lambda然而編譯失敗了....)

另外,優先佇列的排序方法與實際結果正好是相反的,這一點需要注意。

STL容器 優先佇列priority queue

priority queue顧名思義,是乙個具有權值概念的queue,它和queue一樣允許加入新元素 移除舊元素等功能。由於這是乙個queue,所以只允許在底部加入元素,從頂部取出元素。但優先佇列帶有權值概念,其內的元素自動按照元素的權值排序。權值最高者排在最前面。stl的priority que...

STL初步 優先佇列Priority queue

這個優先到底是如何優先?和普通佇列區別在哪?priority queue type,container,functional priority queue,less q priority queue,less a q priority queue,less b 優先佇列中沒有迭代器 也沒有clear...

優先順序佇列用法詳解(priority queue)

由於優先順序佇列的內部資料結構為堆,所以這裡先介紹堆的一些操作。堆的一些函式操作在algorithm標頭檔案中 在 first,last 範圍內 構造最大堆,first,last 可以是vector指標也可以是陣列指標 make heap first last make heap first las...