数组中,根据出现次数以大到小排序,当频率相同时按元素值降序排序
#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;
}