簡體   English   中英

優先隊列實現說明

[英]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上查找“適配器模式”。)出於性能方面的考慮,可以告訴編譯器應在下面使用哪個容器。 可以使用標准庫中的類, dequevector 有關容器類的要求,請參見此處

現在,比較器是用於定義元素順序的工具。 它可以是函數指針,也可以是帶有括號運算符的類。 它采用您元素類型的兩個參數,如果第一個元素應出現在隊列中的第二個元素之后,則返回(布爾)“ 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM