【问题标题】:Priority Queue of custom Class using Comparator with argument on constructor in C++自定义类的优先级队列使用比较器与 C++ 中的构造函数参数
【发布时间】:2013-03-10 18:11:18
【问题描述】:

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

我应该如何进行?

非常感谢!

【问题讨论】:

  • 你是怎么解决这个问题的?我想做类似的事情。

标签: c++ priority-queue comparator


【解决方案1】:

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

    Edge 类中重载operator==operator!=operator&gt;operator&lt;,这样您就可以在比较器中比较它们e1 == e2

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

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

    【讨论】:

    • 是的,我确实重载了那些运算符...我只是没有提及它,因为我认为它不重要。你的意思是让std::map 成为Edge 类的私有成员?在我的具体问题中,这样做没有任何意义。我需要从“外部”获取它。
    【解决方案3】:

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

    【讨论】:

    • 同样在this link,它涉及到C++标准库。
    猜你喜欢
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多