c++的lambda表达式是什么_c++函数式编程风格入门

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

lambda表达式是C++11引入的一种简洁定义匿名函数的方式,它允许你在需要函数对象的地方直接写函数逻辑,而无需提前声明一个函数或函数对象。这在使用STL算法时特别有用,比如std::sortstd::for_each等。

基本语法

lambda表达式的语法结构如下:

[捕获列表](参数列表) -> 返回类型 { 函数体 }

其中返回类型可以省略,编译器会尝试自动推导。如果函数体只有一条return语句,连-> 返回类型也可以省略。

例如,定义一个简单的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::vector nums = {-3, 1, -5, 2};
std::sort(nums.begin(), nums.end(), [](int a, int b) {
    return std::abs(a) < std::abs(b);
});

存储与传递lambda

lambda的类型是唯一的、匿名的,不能直接用普通函数指针接收。但可以用std::functionauto保存。

#include 
std::function square = [](int x) { return x * x; };

这使得lambda可以作为参数传递给其他函数,实现回调或策略模式。

基本上就这些。lambda让C++代码在处理算法和回调时更灵活简洁,是现代C++编程的重要工具。掌握它有助于写出更易读、模块化的代码。