首页 > Python资料 博客日记
C++ Lambda表达式:简化自定义排序的利器
2024-08-19 01:00:06Python资料围观64次
目录
引出问题
在C++的STL中,std::sort
是一个非常强大的算法,它能够对容器中的元素进行排序。然而,默认情况下,std::sort
只会按照元素的默认顺序进行排序,这通常不符合我们的需求。特别是当我们需要对自定义数据类型进行排序时,std::sort
并不知道我们的排序标准。这时,我们需要提供一个自定义的比较函数作为std::sort
的第三个参数,来定义我们自己的排序逻辑。
常规比较器
在C++中,我们通常会定义一个专门的比较函数来解决多维度排序问题。例如,如果我们有一个结构体DimN
,它包含多个维度的数据,我们可以定义如下比较函数:
struct DimN {
int x, y, z, w;
};
bool compareDimN(const DimN& a, const DimN& b) {
if (a.x != b.x) return a.x < b.x;
if (a.y != b.y) return a.y < b.y;
if (a.z != b.z) return a.z < b.z;
return a.w < b.w; // 按照x, y, z, w的顺序进行排序
}
使用这个比较函数,我们可以对包含DimN
类型元素的容器进行排序:
vector<DimN> vec = {{1, 2, 3, 4}, {4, 3, 2, 1}, {2, 2, 3, 2}};
sort(vec.begin(), vec.end(), compareDimN);
Lambda表达式的定义与功能
Lambda表达式是C++11引入的一种便捷的匿名函数语法。它允许你在需要时快速定义一个函数对象,而无需编写完整的函数定义。
返回结果的逻辑
Lambda表达式的返回值代表比较的结果。如果返回
true
,则表示第一个参数应该排在第二个参数之前;如果返回false
,则表示第一个参数应该排在第二个参数之后。
使用格式
Lambda表达式的一般格式如下:
[捕获子句](参数列表) -> 返回类型 { 函数体 }
- 捕获子句:定义了Lambda可以访问的外部变量。
- 参数列表:Lambda表达式接受的参数。
- 返回类型:如果函数体中只有一条返回语句,可以省略返回类型,否则需要显式指定。
使用范围
Lambda表达式可以在任何需要函数对象的地方使用,包括但不限于算法的比较器、事件处理、线程参数等。
示例:使用Lambda进行多维度排序
以下是使用Lambda表达式对不同维度的数据类型进行排序的示例:
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
// 定义具有多个维度的结构体
struct Dim2 {
int x, y;
};
struct Dim3 {
int x, y, z;
};
struct Dim4 {
int w, x, y, z;
};
int main() {
// 对二维数据进行排序
vector<Dim2> vec2 = {{3, 2}, {1, 4}, {2, 1}};
sort(vec2.begin(), vec2.end(), [](const Dim2& a, const Dim2& b) {
return a.x < b.x || (a.x == b.x && a.y < b.y);
});
// 对三维数据进行排序
vector<Dim3> vec3 = {{3, 2, 1}, {1, 4, 3}, {2, 1, 2}};
sort(vec3.begin(), vec3.end(), [](const Dim3& a, const Dim3& b) {
if (a.x != b.x) return a.x < b.x;
if (a.y != b.y) return a.y < b.y;
return a.z < b.z;
});
// 对四维数据进行排序
vector<Dim4> vec4 = {{1, 2, 3, 4}, {4, 3, 2, 1}, {2, 2, 3, 2}};
sort(vec4.begin(), vec4.end(), [](const Dim4& a, const Dim4& b) {
if (a.w != b.w) return a.w < b.w;
if (a.x != b.x) return a.x < b.x;
if (a.y != b.y) return a.y < b.y;
return a.z < b.z;
});
// 打印排序结果
for (const auto& v : vec2) cout << "(" << v.x << ", " << v.y << ") ";
cout << endl;
for (const auto& v : vec3) cout << "(" << v.x << ", " << v.y << ", " << v.z << ") ";
cout << endl;
for (const auto& v : vec4) cout << "(" << v.w << ", " << v.x << ", " << v.y << ", " << v.z << ") ";
cout << endl;
return 0;
}
注释:
- 在Lambda表达式中,我们使用了早期返回(early return)的方式,一旦某个维度的比较结果确定,就立即返回结果,这样可以减少不必要的比较。
- 每个维度的比较都是独立的,如果当前维度相等,则继续比较下一个维度。
- 对于
Dim4
结构体,我们按照w, x, y, z
的顺序进行排序。
Lambda表达式提供了一种非常灵活的方式来定义和使用小的、匿名的函数,它们在编写自定义排序逻辑时尤其有用。通过上述示例,我们可以看到Lambda表达式如何简化多维度排序的实现。希望这篇文章能够帮助你更好地理解Lambda表达式在C++中的使用。
关注博主分享更多C++知识哦~
标签:
上一篇:Python面试宝典第21题:最大正方形
下一篇:谷歌的高级指令有哪些
相关文章
最新发布
- 【Python】selenium安装+Microsoft Edge驱动器下载配置流程
- Python 中自动打开网页并点击[自动化脚本],Selenium
- Anaconda基础使用
- 【Python】成功解决 TypeError: ‘<‘ not supported between instances of ‘str’ and ‘int’
- manim边学边做--三维的点和线
- CPython是最常用的Python解释器之一,也是Python官方实现。它是用C语言编写的,旨在提供一个高效且易于使用的Python解释器。
- Anaconda安装配置Jupyter(2024最新版)
- Python中读取Excel最快的几种方法!
- Python某城市美食商家爬虫数据可视化分析和推荐查询系统毕业设计论文开题报告
- 如何使用 Python 批量检测和转换 JSONL 文件编码为 UTF-8
点击排行
- 版本匹配指南:Numpy版本和Python版本的对应关系
- 版本匹配指南:PyTorch版本、torchvision 版本和Python版本的对应关系
- Python 可视化 web 神器:streamlit、Gradio、dash、nicegui;低代码 Python Web 框架:PyWebIO
- 相关性分析——Pearson相关系数+热力图(附data和Python完整代码)
- Python与PyTorch的版本对应
- Anaconda版本和Python版本对应关系(持续更新...)
- Python pyinstaller打包exe最完整教程
- Could not build wheels for llama-cpp-python, which is required to install pyproject.toml-based proj