c++ - 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 之间会有区别
解决方案
推荐阅读
- javascript - 节点js jquery ajax
- spring - Spring Boot + Mongo DB + Shiro 配置
- java - Junit测试中没有错误类型的合格bean
- java - 如何使用 Android 删除外部文件夹?
- node.js - Node.js - for 循环索引更新为最后一个值(令人惊讶)
- node.js - 用于启动终端应用程序的节点包装器,如 vim、emacs、tmux
- react-native - 使用 react-native-fbsdk 注销的正确方法
- php - 提取带参数的函数调用
- windows - 系统在“C:\Windows\Fonts”文件夹中找不到当前运行进程的目录
- amazon-ec2 - 在 anaconda 中使用 Caffe2 获取 GPU 信息