詳細說明優先順序佇列的使用方法

2021-07-31 03:13:51 字數 2071 閱讀 3636

優先順序佇列是一種常見的資料結構,在《stl原始碼剖析》中給出的定義是:priorty_queue是以個帶權值觀念的queue,它允許加入新元素,移除舊元素,審視元素值等功能。由於這是乙個queue,所以只允許在底端加入元素,並從頂端取出元素。

但是優先順序佇列中的元素並非依照被推入佇列的順序排列。而是自動依照元素的權值排列。權值最高者排在最前面。

預設的情況下維護的是乙個大堆,即權值以從高到低排列。

因為優先順序佇列的內部是用堆來維護,所以很多時候我們要使用堆的情況下會選擇用優先順序佇列來代替

下面我們來說以下常用的幾種

int main()

return

0;}

這種用法是最常用的一種,優先順序判斷預設使用《操作符,輸出按權值從高到低順序。輸出如圖。

如果我們想要按照權值從低到高的順序輸出的話就要使用這種方式。

priority_queue

, greater > qi

第乙個引數為元素的型別,第二個引數為容器型別,第三個引數為比較函式(預設為less),上面的為從小到大的優先順序佇列,如果將greater改為less或者刪去第三個引數,即為權值從大到小排列。如圖。注意greater包含在標頭檔案functional內。

有時候我們想要往佇列裡儲存結構體,那麼為了實現和內建型別一樣的優先順序比較,我們就必須在結構體中實現對「

struct node

friend

bool

operator

< (node n1,node n2)

};int main()

return

0;}

執行結果如圖

在網上很多部落格在講解如何使用優先順序佇列的時候都採用了如下的方式

priority_queuevector

, greater> qi

即呼叫了庫中給出的greater函式,但是我嘗試使用之後發現這種方式不能在結構體中過載「」操作符。因為greater函式和less函式在內部實現的時候使用了不同的操作符。

greater中使用了「>」,所以在使用greater的時候應該過載「>」,

less中使用了「

而網上大部分部落格中不分情況過載「

但是在函式過載的規定中又指出,過載的操作物件只能是類型別或列舉型別,那麼如果優先順序佇列中存放的是指標型別的物件就只能使用另一種方法,使用仿函式,傳遞乙個優先順序比較的演算法到優先順序佇列中。

priority_queuevector

,comapre> qi

這裡的node*是指佇列中儲存的是指向node的結構體的指標,此時就不能使用標準庫中用《操作符來實現優先順序排序的這種方式了。這裡我們實現乙個類使用仿函式傳入乙個比較的演算法,就可以實現優先順序的判斷了。

如下例

struct node

char getval()

};struct cmp

};int main()

return

0;}

輸出結果與第三種情況相同。

優先順序佇列的使用

public class priorityqueuedemo 獲取排在首位的元素 queue.peek 獲取並刪除排在首位的元素 queue.poll 新增元素 queue.add new int 遍歷所有元素 for int arr queue 轉換為陣列 這裡因為t是一維陣列,所有轉換的結果為陣...

複製神器Ditto使用方法詳細說明

我設定成ctrl 1 ctrl 10。但是注意,有些程式裡ctrl有特殊功能,這樣ctrl 0 9 鍵會出現問題,所以建議將貼上快捷鍵設定的複雜一點,例如ctrl alt 0 9 ctrl alt shift 0 9 等等。然後對著要複製的東西,一頓ctrl c,然後分別用ctrl 1 ctrl 1...

php for 迴圈語句使用方法詳細說明

for迴圈只是乙個多一點的 同時迴圈新增到它。而所涉及的乙個迴圈的共同任務是 設定一些計數器變數的初始值。請檢查條件語句是正確的。執行中的 迴圈。增量在每個迭代結束通過迴圈計數器。for迴圈允許你定義乙個簡單的 行這些步驟。它似乎有一種奇怪的形式,所以一定要密切注意語法用quqpo!for 迴圈的語...