首页 > 解决方案 > c++中priority_queue和sort比较器函数的使用区别

问题描述

priority_queue 中的比较器函数和 c++ 中的 std::sort 有时看起来非常相似,但它们之间仍然存在细微差别,有时让我很困惑。

例如,如果我想按 hashmap "hash" 中的字符数以降序对字符串中的字符进行排序:

    unordered_map<char, int> hash;
    for(auto c: S){
        hash[c]++;
    }
    auto cmp = [&hash](char left, char right){
        return hash[left] > hash[right] || hash[left] == hash[right] && left > right;
    };
    sort(S.begin(), S.end(), cmp);

这可行,但如果priority_queue中的另一种情况:

    auto cmp = [](const pair<char, int>& l, const pair<char, int>& r){
        return l.second < r.second;
    };
    priority_queue<pair<char, int>, vector<pair<char, int>>, decltype(cmp)> pq(cmp);

    for(auto p: hash){
        pq.push(p);
    }

为什么我们需要 decltype(cmp) 和 pq(cmp) 在这种情况下?

第一种情况的另一个问题是,是否可以将 cmp 写为一个类?如果是这样,如何正确写?由于在 orgnizeStr 函数中声明了“哈希”,我想知道这是否可能。如果我使用 cmp 作为类,以下内容将不起作用:

 class cmp{
 public:
     bool operator()(char l, char r){
         return hash[l] < hash[r];
     }
 };


 string orgnizeStr(....){
    ........
    unordered_map<char, int> hash;
    for(auto c: S){
        hash[c]++;
    }
    //auto cmp = [&hash](char left, char right){
    //    return hash[left] > hash[right] || hash[left] == hash[right] && left > right;
    //};
    sort(S.begin(), S.end(), cmp);
    ........
}

如果您有任何想法,请告诉我!谢谢!

编辑:我的问题的不同之处在于,我的第一个问题是为什么在使用 lambda 表达式时 std:sort 和 priority_queue 之间会有区别

标签: c++priority-queue

解决方案


推荐阅读