使priority_queue按最小值排序

时间:2016-06-20 01:50:23

标签: c++ priority-queue

假设我有一些像这样的结构:

struct point{
    int x, y;
    //constructor
};

然后是我的比较方法:

bool operator < (point a, point b){
    if(a.x < b.x) return true;
    if(a.x == b.x) return a.y < b.y;
    return false;
}

当我创建:

priority_queue<point> Q;

它基于最大值排序(顶部元素将是具有最大x的那个,等等)。

如何在不改变我的比较方法的情况下按最小值排序? (显然我可以这样做:

bool operator < (point a, point b){
    bool b;
    if(a.x < b.x) b = true;
    else if(a.x == b.x) b = a.y < b.y;
    else b = false;
    return !b;
}

但我正在寻找的是保持比较原样(我觉得cos更好),只需更改priority_queue构造函数,如下所示:

priority_queue<point, reverse> Q;

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:1)

首先你应该为你的结构制作一个operator>,如果检查一个点是否小于另一个点是有意义的,那么检查一个点是否大于另一个点是有意义的。您可以通过简单地反转参数来实现operator<

bool operator>(point a, point b)
{
    return b < a;
}

完成后,您可以使用std::greater标题中的<functional>建立反向优先级队列。

std::priority_queue<point, std::vector<point>, std::greater<point>> Q;

如果您经常需要这种东西,那么定义模板别名可能是值得的:

template<typename T, typename C = std::vector<T>>
using reverse_priority_queue = std::priority_queue<T, C, std::greater<T>>;

reverse_priority_queue<point> Q;