優先順序佇列相對於普通佇列,提供了插隊功能,每次最先出隊的不是最先入隊的元素,而是優先順序最高的元素。
它的實現採用了標準庫提供的heap演算法。該系列演算法一共提供了四個函式。使用方式如下:
首先,建立乙個容器,放入元素:
vectorcoll;列印結果為:insertnums(coll,
3, 7
);insertnums(coll,
5, 9
);insertnums(coll,
1, 4
);printelems(coll,
"all elements:
");
all elements: 34然後我們呼叫make_heap,這個演算法把[beg, end)內的元素建立成堆。5675
6789
1234
make_heap(coll.begin(), coll.end());列印結果:printelems(coll,
"after make_heap: ");
after make_heap: 98然後我們呼叫pop_heap,這個演算法必須保證[beg, end)已經是乙個heap,然後它將堆頂的元素(其實是begin指向的元素)放到最後,再把[begin. end-1)內的元素重新調整為heap6775
5364
1234
pop_heap(coll.begin(), coll.end());列印結果為:coll.pop_back();
printelems(coll,
"after pop_heap: ");
after pop_heap: 87接下來我們呼叫push_heap,該演算法必須保證[beg, end-1)已經是乙個heap,然後將整個[beg, end)調整為heap6745
5364123
coll.push_back(17列印結果為:);push_heap(coll.begin(), coll.end());
printelems(coll,
"after push_heap: ");
after push_heap: 177最後我們使用sort_heap將[beg, end)由heap轉化為有序序列,所以,前提是[beg, end)已經是乙個heap8745
6364
1235
sort_heap(coll.begin(), coll.end());列印結果為:printelems(coll,
"after sort_heap: ");
after sort_heap: 12完整的測試**如下:3344
5566
77817
#include #include根據以上的演算法,我們來實現標準庫的優先順序佇列priority_queue,**如下:#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)
#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 標準庫預設使用元素型別的 操作符來確定他們之間的優先關係...