C 優先佇列 priority queue

2021-09-14 04:42:27 字數 1772 閱讀 3463

既然是佇列那麼先要包含標頭檔案#include, 他和queue不同的就在於我們可以自定義其中資料的優先順序, 讓優先順序高的排在佇列前面,優先出隊

和佇列基本操作相同:

top 訪問隊頭元素

empty 佇列是否為空

size 返回佇列內元素個數

push 插入元素到隊尾 (並排序)

emplace 原地構造乙個元素並插入佇列

pop 彈出隊頭元素

swap 交換內容

優先佇列具有佇列的所有特性,包括基本操作,只是在這基礎上新增了內部的乙個排序,它本質是乙個堆實現的

定義:priority_queue

type 就是資料型別,container 就是容器型別(container必須是用陣列實現的容器,比如vector,deque等等,但不能用 list。stl裡面預設用的是vector),functional 就是比較的方式,當需要用自定義的資料型別時才需要傳入這三個引數,使用基本資料型別時,只需要傳入資料型別,預設是大頂堆

//公升序佇列

priority_queue ,greater> q;

//降序佇列

priority_queue ,less>q;

//greater和less是std實現的兩個仿函式(就是使乙個類的使用看上去像乙個函式。其實現就是類中實現乙個operator(),這個類就有了類似函式的行為,就是乙個仿函式類了)

基本型別例子:

#include#include using namespace std;

int main()

while (!a.empty())

cout << endl;

while (!c.empty())

cout << endl;

b.push("abc");

b.push("abcd");

b.push("cbd");

while (!b.empty())

cout << endl;

return 0;

}

輸出:

4 3 2 1 0

0 1 2 3 4

cbd abcd abc

pari的比較,先比較第乙個元素,第乙個相等比較第二個

#include #include #include using namespace std;

int main()

}

輸出:

2 5

1 31 2

對於自定義型別:

#include #include using namespace std;

//方法1

struct tmp1 //運算子過載<

bool operator<(const tmp1& a) const

};//方法2

struct tmp2 //重寫仿函式

};int main()

cout << endl;

priority_queue, tmp2> f;

f.push(c);

f.push(b);

f.push(a);

while (!f.empty())

}

輸出:

321

321

用二叉堆實現優先佇列 Priority Queue

優先佇列出隊跟佇列一樣,從隊首出隊 但隊內的次序由優先順序決定,即優先順序高的資料項可以插隊,排到前面。二叉堆能夠將優先佇列的入隊和出隊複雜度都保持在o logn 完全二叉樹,如果用順序表來表示的話,設根節點下標為1,若某節點下標為p,則其左子節點下標為2p,右子節點下標為2p 1,父節點下標為p ...

C 優先佇列

半題外話 優先佇列個人認為主要優點是可以在排序後進行類似於插入排序的操作,適合於需要在陣列排序後再次進行操作的題目 再由此產生一堆bug 本蒟蒻是在敲貪心的題時遇見的 弱得連個貪心都不會敲了呵 就開始了學 mo 習 ca 之旅 優先佇列的結構 佇列1.back 返回乙個引用,指向最後乙個元素 2.e...

c 優先佇列

優先佇列容器與佇列一樣,只能從隊尾插入元素,從隊首刪除元素。但是它有乙個特性,就是佇列中最大的元素總是位於隊首,所以出隊時,並非按照先進先出的原則進行,而是將當前佇列中最大的元素出隊。這點類似於給佇列裡的元素進行了由大到小的順序排序。元素的比較規則預設按元素值由大到小排序,可以過載 操作符來重新定義...