C 中priority queue的實現

2021-06-26 03:29:17 字數 3433 閱讀 3117

優先順序佇列相對於普通佇列,提供了插隊功能,每次最先出隊的不是最先入隊的元素,而是優先順序最高的元素。

它的實現採用了標準庫提供的heap演算法。該系列演算法一共提供了四個函式。使用方式如下:

首先,建立乙個容器,放入元素:

vectorcoll;

insertnums(coll,

3, 7

);insertnums(coll,

5, 9

);insertnums(coll,

1, 4

);printelems(coll,

"all elements:

");

列印結果為:

all elements: 34

5675

6789

1234

然後我們呼叫make_heap,這個演算法把[beg, end)內的元素建立成堆

make_heap(coll.begin(), coll.end());

printelems(coll,

"after make_heap: ");

列印結果:

after make_heap: 98

6775

5364

1234

然後我們呼叫pop_heap,這個演算法必須保證[beg, end)已經是乙個heap,然後它將堆頂的元素(其實是begin指向的元素)放到最後,再把[begin. end-1)內的元素重新調整為heap

pop_heap(coll.begin(), coll.end());

coll.pop_back();

printelems(coll,

"after pop_heap: ");

列印結果為:

after pop_heap: 87

6745

5364123

接下來我們呼叫push_heap,該演算法必須保證[beg, end-1)已經是乙個heap,然後將整個[beg, end)調整為heap

coll.push_back(17

);push_heap(coll.begin(), coll.end());

printelems(coll,

"after push_heap: ");

列印結果為:

after push_heap: 177

8745

6364

1235

最後我們使用sort_heap將[beg, end)由heap轉化為有序序列,所以,前提是[beg, end)已經是乙個heap

sort_heap(coll.begin(), coll.end());

printelems(coll,

"after sort_heap: ");

列印結果為:

after sort_heap: 12

3344

5566

77817

完整的測試**如下:

#include #include 

#include

#include

using

namespace

std;

template

void insertnums(t &t, int beg, int

end)

}template

void printelems(const t &t, const

string &s = ""

) cout

<

}int main(int argc, char

const *argv)

根據以上的演算法,我們來實現標準庫的優先順序佇列priority_queue,**如下:

#ifndef priority_queue_hpp

#define priority_queue_hpp#include

#include

#include

template

typename container = std::vector,

typename compare = std::less>

class

priorityqueue

void

pop()

bool empty() const

size_type size()

const

const_reference top()

const

private

: compare comp_;

//比較規則

container cont_; //

內部容器

};template

priorityqueue

::priorityqueue(const compare&comp,

const container&ctnr)

:comp_(comp), cont_(ctnr)

template

template

priorityqueue

::priorityqueue (inputiterator first,

inputiterator last,

const compare&comp,

const container&ctnr)

:comp_(comp), cont_(ctnr)

#endif

//priority_queue_hpp

我們注意到:

1.優先順序佇列內部儲存了排序規則,這與map和set是一致的。

2.前面我們提到heap演算法除了make_heap之外,都必須保證之前是乙個建好的heap,這裡我們在建構函式中呼叫make_heap,保證了後面的各種heap演算法都是合法的。

3.還有一點,如果t與容器的型別不一致,例如priorityqueue>,那麼我們的value_type優先採用int,畢竟我們操作的物件是容器。

測試**如下:

#include "

priorityqueue.hpp

"#include

using

namespace

std;

int main(int argc, char

const *argv)

cout

<

return0;

}



c 中priority queue的用法

include include include using namespace std int main priority queue,cmp q 定義方法 其中,第二個引數為容器型別。第三個引數為比較函式。3 結構體宣告方式 struct node priority queueq 定義方法 在該結...

C 中的優先佇列 Priority queue

priority queue與queueq用法類似,同樣支援以下操作 1.push 將元素進隊 2.top 獲取隊頭元素 3.pop 刪除隊頭元素 4.empty 佇列是否為空 5.size 佇列的長度 對於priority queue原函式的如下所示 priority queuetype為資料型別...

C 優先佇列priority queue

優先佇列是佇列的一種,允許使用者對佇列中儲存的元素設定優先順序。按照資料的優先順序來對佇列中的資料進行動態的排序。每次的push和pop操作,佇列都會動態的調整。所以我們無論按照什麼順序push一堆資料,最終在佇列裡總是top出最大的元素。1 標準庫預設使用元素型別的 操作符來確定他們之間的優先關係...