我想在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
。
我该怎么办?
非常感谢!
答案 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
的构造函数中传入谓词。