自定义sort排序

ops/2025/2/13 8:06:15/

数组中,根据出现次数以大到小排序,当频率相同时按元素值降序排序

#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;
}

http://www.ppmy.cn/ops/157999.html

相关文章

linux安装jdk 许可证确认 user did not accept the oracle-license-v1-1 license

一定要接受许可证&#xff0c;不然会出现 一、添加 ppa第三方软件源 sudo add-apt-repository ppa:ts.sch.gr/ppa二、更新系统软件包列表 sudo apt-get update三、接受许可证 echo debconf shared/accepted-oracle-license-v1-1 select true | sudo debconf-set-selection…

Vue基础入门

Vue基础入门 一、了解Vue的核心设计思想1.1 初识Vue1.1.1 前端技术的发展1.1.2 Vue的基本概念1.1.3 Vue的基本工作原理图1.1.4 Vue的优势1.1.5 Vue、Angular和React的区别 二、开发环境2.1 Visual Studio Code编辑器2.1.1 下载地址2.1.2 Visual Studio Code编辑器特点 2.2 Vue的…

RK3588视觉控制器与AI 算法:开启工业视觉检测新境界

在实际应用中&#xff0c;工业相机拍摄产品的图像&#xff0c;RK3588 迅速接收并进行预处理。AI 算法随即对图像进行深入分析&#xff0c;提取特征并与预设的标准进行对比&#xff0c;从而准确判断是否存在缺陷。 例如&#xff0c;在电子元件生产线上&#xff0c;RK3588 和 AI…

通配符,<include>*/*.*</include>

1. <include>*/*.*</include> 含义&#xff1a;匹配所有子目录中的文件&#xff0c;且文件名必须包含扩展名&#xff08;即必须有 . 后缀&#xff09;。 示例&#xff1a; src/main/java/Test.java ✅docs/README.md ✅data/config.yml ✅但根目录下的 pom.xml ❌…

java韩顺平最新教程,Java工程师进阶

简介 HikariCP 是用于创建和管理连接&#xff0c;利用“池”的方式复用连接减少资源开销&#xff0c;和其他数据源一样&#xff0c;也具有连接数控制、连接可靠性测试、连接泄露控制、缓存语句等功能&#xff0c;另外&#xff0c;和 druid 一样&#xff0c;HikariCP 也支持监控…

嵌入式八股文面试题(二)C语言算法

相关概念请查看文章&#xff1a;C语言概念。 1. 如何实现一个简单的内存池&#xff1f; 简单实现&#xff1a; #include <stdio.h> #include <stdlib.h>//内存块 typedef struct MemoryBlock {void *data; // 内存块起始地址struct MemoryBlock *next; // 下一个内…

机器学习: 逻辑回归

概念与定义 逻辑回归是一种用于分类问题的统计方法。它通过计算目标变量的概率来预测类别归属,并假设数据服从伯努利分布(二分类)或多项式分布(多分类)。逻辑回归模型输出的是概率值,通常使用sigmoid函数将线性组合映射到0和1之间。 1. 概念 逻辑回归用于解决分类问题…

ant- a-data-picker中的 format=“YYYY-MM-DD“ value-format=“YYYY-MM-DD

1.前言 在Ant Design Vue的<a-date-picker>组件中&#xff0c;format和value-format属性用于控制日期的显示和存储格式。 format属性&#xff1a;这个属性用于指定日期选择器的显示格式。例如&#xff0c;format"YYYY-MM-DD"表示日期选择器会以"年…