数组中,根据出现次数以大到小排序,当频率相同时按元素值降序排序
#include <iostream>
#include <vector>
#include <algorithm>
#include <unordered_map>
// 全局的 unordered_map 用于存储元素频率
std::unordered_map<int, int> freq;
// 自定义比较函数
bool cmp(int a, int b) {
if (freq[a] == freq[b]) {
return a > b;
}
return freq[a] > freq[b];
}
int main() {
std::vector<int> arr = {1,3,3,2,22,5,5,5,4,4};
// 统计每个元素的频率
for (int num : arr) {
freq[num]++;
}
// 使用自定义比较函数进行排序
std::sort(arr.begin(), arr.end(), cmp);
// 输出排序后的结果
for (int v : arr) {
std::cout << v << " ";
}
std::cout << std::endl;
return 0;
}
参数类型:比较函数的参数类型必须与要排序的容器中元素的类型一致,也就是说cmp,参数类型与arr里面元素类型一致或者隐式转换不会出问题。
推荐使用lamda表达式
#include <iostream>
#include <vector>
#include <algorithm>
#include <unordered_map>
int main() {
std::vector<int> arr = {1, 3, 3, 2, 22, 5, 5, 5, 4, 4};
std::unordered_map<int, int> freq;
// 统计每个元素的频率
for (int num : arr) {
freq[num]++;
}
// 使用 Lambda 表达式作为比较函数进行排序
std::sort(arr.begin(), arr.end(), [&freq](int a, int b) {
if (freq[a] == freq[b]) {
return a > b;
}
return freq[a] > freq[b];
});
// 输出排序后的结果
for (int v : arr) {
std::cout << v << " ";
}
std::cout << std::endl;
return 0;
}
其中,[&freq] 是捕获列表,使用引用捕获的方式捕获 freq 这个 unordered_map,这样 Lambda 表达式内部就可以访问并使用 freq 了。
另外讲一下sort的一般用法
#include <iostream>
#include <vector>
#include <algorithm>
#include <unordered_map>
using namespace std;
int main(){
vector<int> num{1,3,3,2,22,5,5,5,4,4};
sort(num.begin(),num.end(),less<int>());//升序
sort(num.begin(),num.end());//升序
sort(num.begin(),num.end(),greater<int>());//降序
for(auto x:num) cout<<x<<" ";
return 0;
}
map 自定义排序
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
struct cmp{
bool operator()(int a, int b) const{
return a>b;
}
};
int main(){
//注意这里的是less<int>不是像sort里面的less<int>()
//std::map 的第三个模板参数要求是一个类型,而 greater<int>() 是 std::greater<int> 类型的一个临时对象实例,并非类型
//map<int, string> m;//升序
map<int, string, less<int>> m;//升序
//map<int, string, cmp> m;降序
//map<int, string, greater<int>> m;降序
// map的几种初始化操作
m.insert(make_pair(5, "hhh"));
m.insert(pair<int, string>(3, "lll"));
m.emplace(4, "ggg");
m[1] = "abc";
for(auto x:m){
cout<<x.first<<" "<<x.second<<endl;
}
return 0;
}