C ++优先级队列按对象的特定方法升序排列

时间:2018-11-01 21:25:07

标签: c++ priority-queue

让我们说我有一个名为MyClass的类,每个MyClass对象都有一个名为xVal的方法。我想要的是一个MyClass对象的优先级队列,该对象按MyClass.xVal()的升序排序

到目前为止,我有这个:

priority_queue<MyClass, vector<MyClass>, greater<MyClass>> queue;

当然,它并没有达到我的期望。我遵守,但是对我的对象使用了一些随机排序。如果有人可以指出我在做什么错,将不胜感激。

谢谢。

1 个答案:

答案 0 :(得分:2)

CPP Reference link到优先级队列中,可以将优先级队列定义为:

template<
    class T,
    class Container = std::vector<T>,
    class Compare = std::less<typename Container::value_type>
> class priority_queue;

在这里T=MyClassContainer=std::vector<MyClass>。剩下的唯一内容是Compare,如上所述,可以使用Lambda或Functors来实现。我将同时显示:

假设类定义如下,以xVal()方法的返回值作为排序键:

struct MyClass{
    int count;
    int key;
    int xVal() { return count; };
};

使用Lambdas

//  Lambda skeleton: [capture preferences](arguments){ body }
auto cmp = [](MyClass left, MyClass right) {return left.xVal() > right.xVal();};
std::priority_queue<MyClass, std::vector<MyClass>, decltype(cmp)> queue(cmp);

使用函子

struct CmpFunctor{
    bool operator()(MyClass left, MyClass right) const {
        return left.xVal() > right.xVal();
    }
};
auto cmp = CmpFunctor()
std::priority_queue<MyClass, std::vector<MyClass>, decltype(cmp)> queue(cmp);

这是显示正在运行的代码的link