以下內容摘自
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...