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

Priority Queue of custom Class using Comparator with argument on constructor in C++

本文关键字:Comparator 自定义 优先级 队列 参数 构造函数 c++      更新时间:2023-10-16

我想在c++中创建Edge类的priority_queue

为此,我创建了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;

但是在我的例子中,我需要用变量Qmap来构造edgeComparator

我该怎么做?

非常感谢!

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

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

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

将map作为类的私有成员

根据这里的链接,有一个重载允许您在priority_queue的构造函数中传递谓词。