priority queue用法詳解

2021-08-08 04:21:41 字數 1813 閱讀 8779

一  priority_queue常用函式例項解析

(1) push() push(x) 令x入隊,時間複雜度為o(log n), 其中 n 為當前優先佇列中元素的個數

(2) top() 獲得隊首元素(即堆頂元素),時間複雜度為o(1).

(3) pop() 令隊首元素(即堆頂元素)出隊,時間複雜度為o(log n).

(4) empty() 檢測優先佇列是否為空,返回 true則空,返回false 則非空。時間複雜度為o(1)

(5) size() 返回優先佇列內元素的個數,時間複雜度為 o(1).

二 priority_queue內元素優先順序的設定

如何定義優先佇列內元素的優先順序是運用好優先佇列的關鍵,下面分別介紹基本資料型別( 例如 int ,double ,char)

與結構體的型別的優先順序設定方法。

1  基本資料型別的優先順序設定

此處的基本資料型別指的是int,double,char等可以直接使用的資料型別,優先佇列對他們的優先順序設定一般是數字的大的優先順序越高,因此隊首元素就是優先佇列內元素最大的那個(如果 char 型則是字典序最大的),對基本資料型別,下面兩種優先佇列的定義是等價的(以 int 型為例):

priority_queueq;

priority_queue,less>q;

可以發現,第二種定義的尖括號內多出了兩個引數:乙個是 vector,另乙個是 less. 其中vector是來承載底層資料結構堆(heap)的容器,而第三個引數 less則是對第乙個引數的比較類,less表示數字越大優先順序越大,而greater表示數字越小優先順序越大,

因此,如果想要讓優先佇列總是把最小的元素的放在隊首,只需進行如下定義:

priority_queue,greater>q;

2 結構體的優先設定

先建立乙個水果的結構體:

struct fruit

;

現在希望按水果的**高的為優先順序高,就需要過載(overlode) "<"。過載指的是對已有的運算子進行重新定義,也就是說,可以改變小於號的功能( 例如把它過載為大於號的功能),這裡只提供寫法:
struct fruit

};

這時會發現對小於號的過載於排序函式 sort 中的 cmp函式有些類似,他們的引數都是兩個變數,函式內部都是return了true或 false.事實上,這兩者的作用是類似的,只不過效果看起來是相反的。在排序中,如果是"return f1.price>f2.price", 那麼**是從高到低排序,但是在優先佇列中卻是把**低的放在隊首。原因在於:優先佇列本身預設的規則就是優先順序高的放在隊首,因此把小於號過載為大於號時,只不過是把這個規則反向了一下

那麼有沒有辦法跟 sort中的cmp函式那樣寫在結構體外面呢,自然是有的,如下:

struct cmp

};

在這種情況下,定義優先隊列為:

priority_queue,cmp>q;

最後指出,如果結構體內的資料較為龐大(例如出現了字串,或者陣列),建議使用引用來提高效率,此時需要在比較類的引數中需要加上「const」和「&」:

friend bool operator < (const fruit &f1,const fruit &f2)

bool operator () (const fruit &f1,const fruit &f2)

priority queue用法小結

優先順序設定 又稱優先佇列,底層用堆實現。隊首元素一定是優先順序最高的那乙個。寫法與其他stl相同 priority queue typename name 和佇列不同,優先佇列沒有front back 函式,而是只能通過top 函式來訪問隊首元素 include include include u...

C STL的priority queue用法總結

翻了很多部落格的總結 1 標頭檔案 include 2 定義 cpp view plain copy priority queue int p 3 優先輸出大資料 priority queue type為資料型別,container為儲存資料的容器,functional為元素比較方式。如果不寫後兩個...

priority queue的常見用法

其底層是用堆來進行實現的 在優先佇列中,隊首元素一定是當前佇列中優先順序最高的那乙個 當然,可以在任何時候往優先佇列裡面加入push元素 而優先佇列底層的資料結構堆 heap 會隨時調整結構 使得每次的隊首元素都是優先順序最大的 1 定義 priority queuename 2 容器內元素的訪問 ...