priority queue優先佇列的用法

2021-07-28 02:47:23 字數 2323 閱讀 3202

priority_queue是乙個順序容器介面卡,其原型:

template ,

class compare = less> class priority_queue;

可見第二個vector是其container,即優先佇列的基礎容器是vector,優先佇列在vector這一容器型別基礎上實現

在優先佇列中,優先順序高的元素先出佇列。

標準庫預設使用元素型別的《操作符來確定它們之間的優先順序關係。

優先佇列的第一種用法,也是最常用的用法:

<

int>

qi;

通過《操作符可知在整數中元素大的優先順序高。

故示例1中輸出結果為:9 6 5 3 2

第二種方法:

在示例1中,如果我們要把元素從小到大輸出怎麼辦呢?

這時我們可以傳入乙個比較函式,使用functional.h函式物件作為比較函式。

<

int, vector

<

int>

, greater

<

int>

>

qi2;

其中第二個引數為容器型別。

第二個引數為比較函式。

故示例2中輸出結果為:2 3 5 6 9

第三種方法:

自定義優先順序。

intpriority;

intvalue;

};

在該結構中,value為值,priority為優先順序。

通過自定義operator《操作符來比較元素中的優先順序。

在示例3中輸出結果為:

優先順序  值

9          5

8          2

6          1

2          3

1          4

但如果結構定義如下:

intpriority;

intvalue;

};則會編譯不過(g++編譯器)

因為標準庫預設使用元素型別的《操作符來確定它們之間的優先順序關係。

而且自定義型別的《操作符與》操作符並無直接聯絡,故會編譯不過。

另一位總結

#include

#include

#include

using namespace std;

struct node

int priority;

int value;

};int main()

;//示例1

priority_queueqi;//普通的優先順序佇列,按從大到小排序

for(i = 0; i < len; i++)

qi.push(a[i]);

for(i = 0; i < len; i++)

return  0;

} 則定義優先順序的時候,直接在類中寫個friend 的操作符過載函式即可: 

class  node 

node( int  x):a(x){} 

friend   bool  operator

else  } 

}; 其中在c++primer第三版 中文版中關於操作符過載有如下描述:

"程式設計師只能為類型別或列舉型別的運算元定義過載操作符我們可以這樣來實現把重 

載操作符宣告為類的成員或者宣告為名字空間成員同時至少有乙個類或列舉型別的引數 

按值傳遞或按引用傳遞"

因此不可用指標型別的引數;

2、如果想定義乙個指標型別的優先佇列,那就不可這麼簡單的定義了,你需要自定義乙個自己的比較函式,在priority_queue的模板函式中,我們可以利用這樣乙個template, class _pr = less>模板,在我們的程式**中,則需要自己定義乙個類來定義第三個模板引數,如:

class  nodepointercomparer  

bool  operator ()( const  node* ne1,  const  node* ne2)  const   

};  

當然在這之前我們的類node要重新書寫 

class  node  

node( int  x):a(x){} 

bool  lessthan( const  node* pnode)  const   

};  

這樣在main函式中就可以定義指標型別的優先佇列了:

int  main()  

return  0; 

}  疑問之處:如果你使用第一種值傳遞的操作符過載,來實現第二種的指標型別優先佇列,是不會達到想要的結果的,個人理解是因為在指標型別的優先佇列中找「

也就是沒有找到指標型別的"

priority queue 優先佇列)

佇列 先輸入先輸出 優先佇列使用方法 標頭檔案 include using namespace std 宣告方法 1.普通方法 priority queueq 下劃線不可漏,預設從大到小輸出隊 2.結構體宣告方式 struct node int x,y frinend bool operator n...

優先佇列 priority queue

優先佇列 是一種抽象資料型別,行為有些像佇列,但是他不是先進先出型佇列 先出優先佇列的元素是佇列中優先順序最高的元素。就像 急診病人插隊 優先佇列的標頭檔案也是 用 priority queuepq 來宣告。這個pq是乙個越小的整數優先順序越低的優先佇列。出隊元素不是先進隊的元素,出隊的方法由que...

優先佇列 PriorityQueue

import queue q queue.priorityqueue q.put 1 新增元素 q.get 刪除元素 python的優先佇列基於最小堆實現。heap 堆 是乙個除了底層節點外的完全填滿的二叉樹,底層可以不完全,左到右填充節點。而最小堆意味著,任一非終端節點的資料值均不大於其左子節點和...