在c ++

时间:2019-03-26 21:16:12

标签: c++ priority-queue

c ++中priority_queue和std :: sort中的比较器函数有时看起来非常相似,但是它们之间仍然有细微差别,有时对我来说很混乱。

例如,如果我想按哈希表“哈希”中的字符数以降序对字符串中的字符进行排序:

    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之间会有差异

0 个答案:

没有答案