2017-06-25 38 views
1

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

当我想创建一个最小队列时,这会特别困惑,这将由std::priority_queue<T, std::vector<T>, std::greater<T>>完成。

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

+3

如果相反,它可能会混淆别人。 – juanchopanza

+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说:“如果它是周围的其他方法,它可能会迷惑别人”。

3

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

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

+0

在我看来,优先级队列的作用与sort()相反。如果你给排序更大,那么front()是最大的值。如果你给优先级队列更大(),那么front是最小的值。 –

相关问题