我有一个优先级队列,我的定义如下:
priority_queue<Node*,vector<Node*>,greater<Node*>> myQueue;
我必须在参数param的基础上添加到队列中,并且我已经像这样重载了
bool Node::operator>(const Node& right) const
{
return param>right.param;
}
因为重载函数不会占用指针对象,所以我应该如何更改它以便调用我的重载函数。 我正在以这种方式添加队列:
Node *myNode
myQueue.add(myNode);
我无法传递myNode而不作为指针对象。 请指导..
@Sellibitze 我做过类似的事情
template<typename Node, typename Cmp = std::greater<Node> >
struct deref_compare : std::binary_function<Node*,Node*,bool>
{
deref_compare(Cmp const& cmp = Cmp())
: cmp(cmp) {}
bool operator()(Node* a, Node* b) const {
return cmp(*a,*b);
}
private:
Cmp cmp;
};
typedef deref_compare<Node,std::greater<Node> > my_comparator_t;
priority_queue<Node*,vector<Node*>,my_comparator_t> open;
我充满了错误。
答案 0 :(得分:7)
您需要编写自己的仿函数进行比较,因为您不能重载运算符&gt;指针。因此,您将使用适当的函数调用运算符来使用您自己的专用类,而不是更大。这甚至可以一般地完成。
template<typename T, typename Cmp = std::less<T> >
struct deref_compare : std::binary_function<T const*,T const*,bool>
{
deref_compare(Cmp const& cmp = Cmp())
: cmp(cmp) {}
bool operator()(T const* a, T const* b) const {
return cmp(*a,*b);
}
private:
Cmp cmp;
};
typedef deref_compare<Node,std::greater<Node> > my_comparator_t;
Edit1:我刚刚意识到你甚至可以通过迭代器而不是指针来实现 more 。 ; - )
编辑2:如果您对模板不满意并且不需要这种概括,您也可以使用
struct my_node_ptr_compare
{
bool operator()(Node const* a, Node const* b) const {
return *a > *b;
}
};
priority_queue<Node*,vector<Node*>,my_node_ptr_compare> foo;
答案 1 :(得分:1)
将运算符&gt;()设置为带有两个节点的节点之友函数。
使用friend
关键字。
一些参考:
http://www.cprogramming.com/tutorial/friends.html
http://msdn.microsoft.com/en-us/library/465sdshe(VS.80).aspx
编辑:这不适用于指针大小写,但可以在常规节点中使用。
答案 2 :(得分:0)
最简单的方法是实现一个将Node指针作为参数的比较函数,如下所示:
bool nodePtrGreater(Node const *a, Node const *b) {
return *a > *b;
}
此功能应使用运算符&gt;您的Node类正确。
[edit]旧版本没有正确定义队列。
像这样创建优先级队列:
priority_queue<Node*,vector<Node*>, bool(*)(Node const *, Node const *)> myQueue(nodePtrGreater);