簡體   English   中英

為什么std :: priority_queue首先返回最大的元素,卻使用std :: less?

[英]Why does std::priority_queue return largest elements first but use std::less?

為什么std::priority_queue使用std::less作為比較類型,卻首先返回最大的元素(即最大優先級隊列)?

當我要創建一個最小隊列時,這特別讓我感到困惑,這將由std::priority_queue<T, std::vector<T>, std::greater<T>>

優先級隊列的作用與sort()相反,使事情變得不太一致。 如果使用greater比較器對vector進行sort() ,則向量的front()是最大值。 如果使用greater的優先級隊列創建隊列,則front是最小值。 我意識到優先級隊列使用堆,但是我覺得這樣做有充分的理由。

這樣做是為了與歷史實現保持一致:自標准模板庫(后來成為C ++)開始以來,許多類(例如std::map )和算法(例如std::sort )就使用了小於關系的排序功能。標准庫。

在多個類和模板之間保持一致很重要,因為庫用戶不需要記住哪個比較是哪個容器或算法的默認值。

因為編寫代碼很自然,所以在使用堆的方法時?

檢查(簡化的)可能的實現:

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所說:“如果相反,它可能會使其他人感到困惑”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM