使用比较器的自定义类的优先级队列在C++中的构造函数的参数
我想在C++中创建Edge
类的priority_queue
。使用比较器的自定义类的优先级队列在C++中的构造函数的参数
对于这一点,我创建了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
与我的变量Qmap
。
我该如何继续?
非常感谢!
模板参数是比较器的类型。您仍然需要将比较器的实例传递给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)));
超载operator==
,operator!=
,operator>
和operator<
在Edge
类,这样你可以在e1 == e2
你比较比较。
也不是来自std::map
。它没有一个virtual
析构函数,因此从它派生出它是一个糟糕的主意。
只需将您的地图作为私人会员加入您的班级即可。
是的,我确实超载了那些操作员......我只是没有提到它,因为我认为这并不重要。 你的意思是让'std :: map'成为'Edge'类的私有成员?在我的具体问题中,这样做没有任何意义。我需要从“外部”获得它。 – DanielX2010 2013-03-10 23:12:06
根据this link here,有一个重载,允许您在priority_queue
的构造函数中传入谓词。
也在[此链接](http://en.cppreference.com/w/cpp/container/priority_queue/priority_queue)中,它涉及C++标准库。 – juanchopanza 2013-03-10 18:31:05
你是怎么解决这个问题?我想做类似的事情。 – igon 2013-06-11 22:15:43