lambda表达式是C++11引入的匿名函数机制,语法为[捕获列表](参数)->返回类型{函数体},可省略返回类型;能捕获外部变量,支持值捕获[=]和引用捕获[&],常用于STL算法如std::sort自定义排序,提升代码简洁性与可读性。

lambda表达式是C++11引入的一种简洁定义匿名函数的方式,它允许你在需要函数对象的地方直接写函数逻辑,而无需提前声明一个函数或函数对象。这在使用STL算法时特别有用,比如std::sort、std::for_each等。
基本语法
lambda表达式的语法结构如下:
[捕获列表](参数列表) -> 返回类型 { 函数体 }
其中返回类型可以省略,编译器会尝试自动推导。如果函数体只有一条return语句,连-> 返回类型也可以省略。
立即学习“C++免费学习笔记(深入)”;
例如,定义一个简单的lambda计算两数之和:
auto add = [](int a, int b) {
return a + b;
};
int result = add(3, 4); // result为7
捕获列表的作用
lambda可以访问其定义作用域中的变量,这通过捕获列表实现。捕获方式有几种:
- []:不捕获任何外部变量
- [=]:按值捕获所有外部变量
- [&]:按引用捕获所有外部变量
- [x, &y]:按值捕获x,按引用捕获y
- [this]:捕获当前对象的this指针(在类成员函数中常用)
示例:使用捕获列表读取外部变量
int multiplier = 5;
auto multiply = [multiplier](int n) {
return n * multiplier;
};
int val = multiply(3); // val为15
注意:按值捕获的变量在lambda创建时就已确定,后续修改原变量不会影响lambda内部的副本;而按引用捕获则会反映后续变化。
函数式编程风格的应用
C++支持部分函数式编程特性,lambda是其中核心。结合STL算法,可以让代码更清晰、紧凑。
常见用法:
- 配合
std::sort自定义排序规则 - 用
std::find_if查找满足条件的元素 - 用
std::transform对容器元素进行映射
例如,对vector按绝对值排序:
std::vectornums = {-3, 1, -5, 2}; std::sort(nums.begin(), nums.end(), [](int a, int b) { return std::abs(a) < std::abs(b); });
存储与传递lambda
lambda的类型是唯一的、匿名的,不能直接用普通函数指针接收。但可以用std::function或auto保存。
#includestd::function square = [](int x) { return x * x; };
这使得lambda可以作为参数传递给其他函数,实现回调或策略模式。
基本上就这些。lambda让C++代码在处理算法和回调时更灵活简洁,是现代C++编程的重要工具。掌握它有助于写出更易读、模块化的代码。











