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