2013-03-10 53 views
1

我想在C++中創建Edge類的priority_queue使用比較器的自定義類的優先級隊列在C++中的構造函數的參數

對於這一點,我創建了edgeCompare比較類,如下所示:

class edgeCompare{ 
public: 
    map<int, glm::mat4x4> * Qmap; 

    edgeCompare(const map<int, glm::mat4x4> & Qm){ 
     * Qmap = Qm; 
    } 

    bool operator() (const Edge & e1, const Edge & e2) const{ 
     // code that compares and returns corresponding bool 
     // OBS: in this function I use *Qmap 
    } 
} 

的事情是,你可以看到,我需要一個外部變量來進行比較。

一個priority_queue通常被聲明爲:

priority_queue<Edge, vector<Edge>, edgeCompare> pq; 

但在我而言,我需要構造edgeComparator與我的變量Qmap

我該如何繼續?

非常感謝!

+0

你是怎麼解決這個問題?我想做類似的事情。 – igon 2013-06-11 22:15:43

回答

1

模板參數是比較器的類型。您仍然需要將比較器的實例傳遞給priority_queue構造函數,也就是說,您可以使用任何喜歡的參數構造比較器實例。

例如:

map<int, glm::mat4x4> m; 
edgeCompare comp(m); 
priority_queue<Edge, vector<Edge>, edgeCompare> pq(comp); 

您還可以創建edgeCompare對象直列但需要消除歧義額外的括號:

priority_queue<Edge, vector<Edge>, edgeCompare> pq((edgeCompare(m))); 
2

超載operator==operator!=operator>operator<Edge類,這樣你可以在e1 == e2你比較比較。

也不是來自std::map。它沒有一個virtual析構函數,因此從它派生出它是一個糟糕的主意。

只需將您的地圖作爲私人會員加入您的班級即可。

+0

是的,我確實超載了那些操作員......我只是沒有提到它,因爲我認爲這並不重要。 你的意思是讓'std :: map'成爲'Edge'類的私有成員?在我的具體問題中,這樣做沒有任何意義。我需要從「外部」獲得它。 – DanielX2010 2013-03-10 23:12:06

2

根據this link here,有一個重載,允許您在priority_queue的構造函數中傳入謂詞。

+1

也在[此鏈接](http://en.cppreference.com/w/cpp/container/priority_queue/priority_queue)中,它涉及C++標準庫。 – juanchopanza 2013-03-10 18:31:05