STL容器之優先佇列

2022-07-13 02:27:10 字數 3029 閱讀 1956

優先順序佇列,以前刷題的時候用的比較熟,現在竟然我只能記得它的關鍵字是priority_queue(太傷了)。在一些定義了權重的地方這個資料結構是很有用的。

先回顧佇列的定義:佇列(queue)維護了一組物件,進入佇列的物件被放置在尾部,下乙個被取出的元素則取自佇列的首部。priority_queue特別之處在於,允許使用者為佇列中儲存的元素設定優先順序。這種佇列不是直接將新元素放置在佇列尾部,而是放在比它優先順序低的元素前面。標準庫預設使用《操作符來確定物件之間的優先順序關係,所以如果要使用自定義物件,需要過載 < 操作符。

優先佇列有兩種,一種是最大優先佇列;一種是最小優先佇列;每次取自佇列的第乙個元素分別是優先順序最大和優先順序最小的元素。

1) 優先佇列的定義

包含標頭檔案:"queue.h", "functional.h"

可以使用具有預設優先順序的已有資料結構;也可以再定義優先佇列的時候傳入自定義的優先順序比較物件;或者使用自定義物件(資料結構),但是必須過載好< 操作符。 

2) 優先佇列的常用操作

優先順序佇列支援的操作

q.empty()         如果隊列為空,則返回true,否則返回false

q.size()            返回佇列中元素的個數

q.pop()             刪除隊首元素,但不返回其值

q.top()             返回具有最高優先順序的元素值,但不刪除該元素

q.push(item)     在基於優先順序的適當位置插入新元素

其中q.top()為查詢操作,在最小優先佇列中搜尋優先權最小的元素,在最大優先佇列中搜尋優先權最大的元素。q.pop()為刪除該元素。優先佇列插入和刪除元素的複雜度都是o(lgn),所以很快

另外,在優先佇列中,元素可以具有相同的優先權。

下面這個c例子,包含了幾乎所有常見的優先佇列用法。 

#include#include

#include

#include

using

namespace

std;

//定義比較結構

struct

cmp1

};struct

cmp2

};//

自定義資料結構

struct

number1

};struct

number2

};int a=;

number1 num1=;

number2 num2=;

intmain()

for(i=0;num1[i].x;i++)

que5.push(num1[i]);

for(i=0;num2[i].x;i++)

que6.push(num2[i]);

printf(

"採用預設優先關係:/n(priority_queueque;)/n");

printf(

"queue 0:/n");

while(!que.empty())

puts(

"");

puts(

"");

printf(

"採用結構體自定義優先順序方式一:/n(priority_queue,cmp>que;)/n");

printf(

"queue 1:/n");

while(!que1.empty())

puts(

"");

printf(

"queue 2:/n");

while(!que2.empty())

puts(

"");

puts(

"");

printf(

"採用標頭檔案/

"functional/"

內定義優先順序:/n(priority_queue,greater/less>que;)/n");

printf(

"queue 3:/n");

while(!que3.empty())

puts(

"");

printf(

"queue 4:/n");

while(!que4.empty())

puts(

"");

puts(

"");

printf(

"採用結構體自定義優先順序方式二:/n(priority_queueque)/n");

printf(

"queue 5:/n");

while(!que5.empty())

puts(

"");

printf(

"queue 6:/n");

while(!que6.empty())

puts(

"");

return0;

}/*執行結果 :

採用預設優先關係:

(priority_queueque;)

queue 0:

91 83 72 56 47 36 22 14 10 7 3

採用結構體自定義優先順序方式一:

(priority_queue,cmp>que;)

queue 1:

3 7 10 14 22 36 47 56 72 83 91

queue 2:

91 83 72 56 47 36 22 14 10 7 3

採用標頭檔案"functional"內定義優先順序:

(priority_queue,greater/less>que;)

queue 3:

3 7 10 14 22 36 47 56 72 83 91

queue 4:

91 83 72 56 47 36 22 14 10 7 3

採用結構體自定義優先順序方式二:

(priority_queueque)

queue 5:

3 7 10 14 22 36 47 56 72 83 91

queue 6:

91 83 72 56 47 36 22 14 10 7 3

*/

STL容器之優先佇列

優先順序佇列,以前刷題的時候用的比較熟,現在竟然我只能記得它的關鍵字是priority queue 太傷了 在一些定義了權重的地方這個資料結構是很有用的。先回顧佇列的定義 佇列 queue 維護了一組物件,進入佇列的物件被放置在尾部,下乙個被取出的元素則取自佇列的首部。priority queue特...

STL容器之優先佇列

參考 拼裝小火車 要學會如何定義最小優先佇列 最大優先佇列 對於自己定義的結構體,如何定義最小 最大優先佇列 核心 定義比較結構 struct cmp1 struct cmp2 自定義資料結構 struct number1 struct number2 priority queue que 採用預設...

STL容器 優先佇列

優先佇列 在佇列基礎上按優先順序順序進入佇列 0.標頭檔案 include greater和less的優先順序比較 和自定義的作用一樣 在標頭檔案 include 裡 1.建立乙個優先順序佇列時有兩種申請方式 priority queueq或者priority queue,greater q,第一種...