使用比较器的自定义类的优先级队列在C++中的构造函数的参数

使用比较器的自定义类的优先级队列在C++中的构造函数的参数

问题描述:

我想在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

模板参数是比较器的类型。您仍然需要将比较器的实例传递给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))); 

超载operator==operator!=operator>operator<Edge类,这样你可以在e1 == e2你比较比较。

也不是来自std::map。它没有一个virtual析构函数,因此从它派生出它是一个糟糕的主意。

只需将您的地图作为私人会员加入您的班级即可。

+0

是的,我确实超载了那些操作员......我只是没有提到它,因为我认为这并不重要。 你的意思是让'std :: map'成为'Edge'类的私有成员?在我的具体问题中,这样做没有任何意义。我需要从“外部”获得它。 – DanielX2010 2013-03-10 23:12:06

根据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