最近浏览帖子,发现有很多新手在从大到小排序时,先用了sort从小到大排序,再用reverse进行反转,这样让我看得非常觉得新手!sort可以传入比较大小函数,这样一步达到想要结果,可是需要单独写比较函数,很多人就直接弃用了!这完全是没有了解lambda函数,我来做个总结,让你的代码变得顺畅起来吧!(都是我平时用到的lambda函数的经验总结)
1、从大到小排序这样写更高级!
错误示范网帖:
改进:
结构体、自定义类型等快速排序,也可以用:
先来了解一下匿名函数,不想知道细节的直接跳过!
匿名函数的几大要素
- 捕获列表:按值捕获
[=]
和按引用捕获[&]
- 可变性(
mutable
关键字):默认不添加不修改捕获的外部变量,加上就可以修改,如
- 参数列表:Lambda 函数的参数列表与普通函数一样,但可以省略参数名,只保留参数类型。
- 返回类型推导: 一般加->类型,C++14 以后可以自动推导,不加也没事
- 函数指针:Lambda 函数本质上是函数的快速写,可以用函数指针传递,当然也可以用异常等等函数的行为。
2、使用STL时不妨用Lambda 函数
std::vector<int> numbers = { 1, 2, 3, 4, 5 };
//累加
int sum = std::accumulate(numbers.begin(), numbers.end(), 0,
[](int a, int b) {return a + b; });
//容器过滤
std::vector<int> even_numbers;
std::copy_if(numbers.begin(), numbers.end(), std::back_inserter(even_numbers),
[](int x) {return x % 2 == 0; });
//元素转换
std::vector<int> squared_numbers;
std::transform(numbers.begin(), numbers.end(), std::back_inserter(squared_numbers),
[](int x) {return x * x; });
//自定义查找
auto it = std::find_if(numbers.begin(), numbers.end(),
[](int x) {return x % 2 == 0; }); // 找到第一个偶数
经常for循环的,可以用这个!比如数组中都增加、相乘一个数字,等等就可以用到上诉:元素转换
3、快速便捷的一个小函数
作为参数,快速实现函数的调用,比如:
比如:函数传参
void performOperation(int x, int y, std::function<int(int, int)> operation)
{
std::cout << operation(x, y) << std::endl;
}
int main()
{
performOperation(3, 4, [](int a, int b){ return a + b; }); // 输出 7
return 0;
}
比如:简单函数定义
#include <iostream>
int main() {
auto add = [](int a, int b) {
return a + b;
};
auto subtract = [](int a, int b) {
return a - b;
};
std::cout << "加法结果: " << add(3, 4) << std::endl; // 输出 7
std::cout << "减法结果: " << subtract(8, 5) << std::endl; // 输出 3
return 0;
}
4、递归函数
用到最多就是STL里面的了,目前想不到了,后续再工作中遇到的话,再来补充吧,未完待续!