为什么std::priority_queue
首先返回最大的元素(即最大优先级队列),即使它使用std::less
作为比较类型?
当我想创建一个由std::priority_queue<T, std::vector<T>, std::greater<T>>
完成的最小队列时,这尤其让我感到困惑。
优先级队列与sort()
相反,使事情变得不那么一致。如果您使用sort()
比较器vector
greater
,则向量的front()
是您的最大值。如果使用greater
创建优先级队列,则front是最小值。我意识到优先级队列使用堆,但我觉得有一个很好的理由。
答案 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;。