如何超载>队列的运算符

时间:2009-09-25 19:22:42

标签: c++

我有一个优先级队列,我的定义如下:

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; 

我充满了错误。

3 个答案:

答案 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);