使用Comparator的自定义类的优先级队列与C ++中构造函数的参数

时间:2013-03-10 18:11:19

标签: c++ priority-queue comparator

我想在C ++中创建类priority_queue的{​​{1}}。

为此,我创建了Edge比较器类,如下所示:

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

我该怎么办?

非常感谢!

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

operator==课程中重载operator!=operator>operator<Edge,以便您可以在比较器中比较它们e1 == e2

也不要派生自std::map。它没有virtual析构函数,这使得从它派生出一个坏主意。

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

答案 2 :(得分:2)

根据this link here,有一个重载允许你在priority_queue的构造函数中传入谓词。