[英]priority queue implementation explanation
我正在從《競爭編程》一書中閱讀Dijkstra的算法。在實現程序中,他們寫了這樣的東西:
#define pair<int,int> ii;
priority_queue< ii,vector<ii>,greater<ii> > pq ;
如果我們將整數s作為源,則該實現將按如下所示推對(cost,source)(節點從1到n編號):
pq.push(ii(0,s)) ;
我的問題是,我們在優先級隊列中推送了一對成本和節點。 但是,在priority_queue聲明中,其他兩個參數(即vector和Greater)正在做什么?
priority_queue< ii,vector<ii>,greater<ii> > pq ;
我試圖聲明類似:
priority_queue< ii > pq ;
並且代碼可以正常工作(在我嘗試過的那些測試用例上)。
誰能告訴我聲明的含義:
priority_queue< ii,vector<ii>,greater<ii> > pq ;
上面的聲明和
priority_queue< ii > pq ;
宣言 ?
因此,模板類的聲明是這樣的:
template <class T, class Container = vector<T>, class Compare = less<typename Container::value_type> > class priority_queue;
應該有三個模板參數。 第一個“ T”是元素的類型(在您的情況下為ii)。 第二個參數是我所謂的“基礎容器”。 您會看到,priority_queue是一個適配器,即它在向您提供另一組操作的同時秘密使用了其他容器。 (您可能希望在Wikipedia上查找“適配器模式”。)出於性能方面的考慮,可以告訴編譯器應在下面使用哪個容器。 可以使用標准庫中的類, deque
和vector
。 有關容器類的要求,請參見此處 。
現在,比較器是用於定義元素順序的工具。 它可以是函數指針,也可以是帶有括號運算符的類。 它采用您元素類型的兩個參數,如果第一個元素應出現在隊列中的第二個元素之后,則返回(布爾)“ true”。 當您要更改默認順序或使用某些特殊方式對元素進行排序時,此功能很有用。
例如,請參見下面的簡單示例
struct car{
car(double engine_displ):_engine_displ(engine_displ) {}
double _engine_displ;
};
bool cmp_cars(car one, car other){
return one._engine_displ < other._engine_displ;
}
//..somewhere else
std::priority_queue<car, std::vector<car>, cmp_cars> pq;
然后,隊列應容納std::vector
vector-滿載的汽車(按發動機排量排序)。
如果模板參數列表中有類似class Container = vector<T>
,則當您不說基礎容器類型是什么時,編譯器會為您填充std::vector<T>
。 這就是為什么您只能說priority_queue<ii>
; 編譯器將其擴展到priority_queue<ii,vector<ii>,less<ii>>
。 在您的示例中,這本書的作者明確地使用了greater<ii>
,因此隊列應將最小的元素放在前面。 這是有道理的,因為在Dijkstra的算法中,您對成本最低的路徑感興趣。 priority_queue<ii>
默認情況下使用less<ii>
,因此現在隊列會將具有最大cose的路徑放在前面,這沒有任何意義。
附帶說明,您可能會發現代碼實際上是typedef pair<int,int> ii
。 #define
指令告訴預處理器用“ ii”替換每pair<int,int>
,這根本沒有幫助。 Typedef告訴編譯器“ ii”表示pait<int,int>
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.