2

我想在 C++中创建一个priority_queue类。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
    }
}

如您所见,问题是我需要一个外部变量来进行比较。

Apriority_queue通常声明为:

priority_queue<Edge, vector<Edge>, edgeCompare> pq;

但就我而言,我需要edgeComparator用我的变量构造Qmap

我应该如何进行?

非常感谢!

4

3 回答 3

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)));
于 2013-11-29T18:28:53.840 回答
2

在类中重载operator==、和operator!=,以便您可以在比较器中比较它们。operator>operator<Edgee1 == e2

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

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

于 2013-03-10T18:23:43.593 回答
2

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

于 2013-03-10T18:25:08.483 回答