priority queue的過載運算子原理

2021-07-27 16:59:33 字數 1610 閱讀 6698

#include

using namespace std; (記得包含標頭檔案噢)

1.  priority_queue在stl內部定義的原型是:

template< class t ,

class sequence=vector,

classcompare=less> (主要,要乙個空格,否則編譯器會當做右移操作符,報錯)

classpriority_queue;

最簡單的用法:

priority_queueq;   // 注意上面第二個引數,和第三個引數的預設值。

//對於內建的物件,可以這麼簡單的定義;特別注意第三個引數, 預設的小於號(<), 即降序排序,預設的是大根堆。權值最大的會被彈出來。

最常見的用法:

priority_queueq;   // 恩,自己定義的型別。

----------上面兩種型別,當自己需要的堆是小根堆的時候,即元素按公升序(從小到達的彈出),那麼必須改寫比較函式.

即對於stl中優先佇列的使用,最重要的就是這個比較函式的書寫(或對'<','>'的過載)了,常見的方法有下面兩種:

1. 方法一,過載'<' ('>')運算子:

//overload the < operator.bool operator< (conststudent& structstudent1, const student &structstudent2) //這個有點搞事的嫌疑,含義都反了

//overload the > operator.bool operator> (conststudent& structstudent1, const student &structstudent2)

具體使用的時候://declare a priority_queue and specify the order asagepriority_queue,less::value_type> >pqstudent1;

----因為預設的less, 所以過載'<'後,第二個引數,第三個引數可以省略//declare a priority_queue and specify the order as>//the priorities will be assigned in the descending order ofagepriority_queue,greater::value_type> >pqstudent2;

------如果過載的是'>'運算子,必須將第三個引數寫出來,greater 

2. 方法二,構造『比較函式』,然後指定priority_queue的第三個引數

struct cmp

//當想要大根堆,降序時,讓它返回false就好,即用'<' (預設值)

}多關鍵字比較、'排序':

struct cmp

};priority_queue, cmp> p;

-----------其實這兩種方法,很常見。使用stl的algorithm裡的sort等演算法時,都需要指定!

2. 對於優先佇列使用時,特別是多個case的時候,要注意初始的清空!

while ( !q.empty() )  q.pop();    //效率不高?為什麼沒有提供clear的功能噢。

q.push( cur );   q.top();  q.pop();  q.size();

C 優先佇列priority queue及過載

優先佇列中的元素不同於一般先進先出的佇列,被賦予了優先順序,優先順序佇列具有最高端先出的行為特徵,通常採用堆這種資料結構來實現。基本操作如下 priority queuepq pq.empty 隊列為空返回true,否則返回false pq.size 返回佇列中元素的個數 pq.push 在基於優先...

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 容器內元素的訪問 ...