首页 > Python资料 博客日记
C++ Lambda表达式:简化自定义排序的利器
2024-08-19 01:00:06Python资料围观101次
目录
引出问题
在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 opencv)
- Python 图像处理进阶:特征提取与图像分类
- 大数据可视化分析-基于python的电影数据分析及可视化系统_9532dr50
- 【Python】入门(运算、输出、数据类型)
- 【Python】第一弹---解锁编程新世界:深入理解计算机基础与Python入门指南
- 华为OD机试E卷 --第k个排列 --24年OD统一考试(Java & JS & Python & C & C++)
- Python已安装包在import时报错未找到的解决方法
- 【Python】自动化神器PyAutoGUI —告别手动操作,一键模拟鼠标键盘,玩转微信及各种软件自动化
- Pycharm连接SQL Sever(详细教程)
- Python编程练习题及解析(49题)
点击排行
- 版本匹配指南:Numpy版本和Python版本的对应关系
- 版本匹配指南:PyTorch版本、torchvision 版本和Python版本的对应关系
- Python 可视化 web 神器:streamlit、Gradio、dash、nicegui;低代码 Python Web 框架:PyWebIO
- 相关性分析——Pearson相关系数+热力图(附data和Python完整代码)
- Anaconda版本和Python版本对应关系(持续更新...)
- Python与PyTorch的版本对应
- Windows上安装 Python 环境并配置环境变量 (超详细教程)
- Python pyinstaller打包exe最完整教程