2012-08-02 61 views
1

對不清楚的標題,實際上我想不出一個簡潔地描述我的問題的標題。包含指向對象的指針的多重集的自定義比較器

但問題很簡單。我有一個Node類。我想通過它的id_字段維護其對象之間的順序。我知道如果我在Node類中重載<運算符或在多重集中提供Comparator對象,我知道製作多重集合<節點>將正確地維護容器中的順序。但是我想申報一個multiset < Node * >容器並想要實現相同的行爲。

這裏是我的節點類定義:

class Node { 
     int id_; 
     ... 
     public: 
     Node() { 
       ... 
     } 
     int getId() { 
       return id_; 
     } 
     void setId(int id) { 
       id_ = id; 
     } 
     ... 
     bool operator<(const Node &input) { 
       return (this->id_ < input.id_); 
     } 
}; 

我該怎麼辦?

回答

5

我想你的意思是什麼,你需要的是這樣的:

template <typename T, typename Pred = std::less<T>> 
struct ptr_compare : Pred 
{ 
    ptr_compare(Pred const & p = Pred()) : Pred(p) { } 

    bool operator()(T const * p1, T const * p2) const 
    { 
     return Pred::operator()(*p1, *p2); 
    } 
}; 

typedef std::multiset<Node*, ptr_compare<Node>> node_ptr_set; 

可以使用ptr_compare模板,需要一個二元謂詞任何容器,你想間接地應用謂詞。

+0

似乎在第一個網站深奧。沒有其他更簡單的方法嗎?或者你可以請一些痛苦和解釋嗎?謝謝! – Prabhakar 2012-08-02 09:46:47

+0

@Prab:它只是一個包裝指針,並將它們解析爲原始謂詞......需要解釋什麼?你知道'std :: less '是如何工作的嗎? – 2012-08-02 09:48:19

+0

是的,但Pred是什麼?我瞭解的其他一切。 – Prabhakar 2012-08-02 09:57:31