为什么std :: priority_queue首先返回最大的元素但是使用std :: less?

时间:2017-06-25 21:05:37

标签: c++ priority-queue c++-standard-library

为什么std::priority_queue首先返回最大的元素(即最大优先级队列),即使它使用std::less作为比较类型?

当我想创建一个由std::priority_queue<T, std::vector<T>, std::greater<T>>完成的最小队列时,这尤其让我感到困惑。

优先级队列与sort()相反,使事情变得不那么一致。如果您使用sort()比较器vector greater,则向量的front()是您的最大值。如果使用greater创建优先级队列,则front是最小值。我意识到优先级队列使用堆,但我觉得有一个很好的理由。

2 个答案:

答案 0 :(得分:3)

这样做是为了与历史实现保持一致:许多类(例如std::map)和算法(例如std::sort)自标准模板库开始以来对其排序功能使用了小于关系,后来成为C ++标准库。

在多个类和模板之间保持一致非常重要,因为库用户不需要记住哪个容器或算法的默认比较。

答案 1 :(得分:1)

因为在使用堆的方法时代码很自然吗?

检查(简化)可能的实施:

template <class T, class Container = std::vector<T>, class Compare = std::less<T> >
class priority_queue {

public:
    explicit priority_queue(const Container& c_  = Container(),
                            const Compare& comp_ = Compare())
        : c(c_), comp(comp_)
    {
        std::make_heap(c.begin(), c.end(), comp);
    }

    void push(const T& x)
    {
        c.push_back(x);
        std::push_heap(c.begin(), c.end(), comp);
    }

    void pop()
    {
        std::pop_heap(c.begin(), c.end(), comp);
        c.pop_back();
    }
};

我明白你的意思,但正如juanchopanza所说:&#34;如果是相反的话,那可能会让别人感到困惑&#34;。