C++ Lambda表达式

简介

Lambda 表达式是 C++11 引入的一个特性,它允许定义匿名(无名)函数或闭包。这在 STL 算法、并发编程以及需要临时计算或局部函数的场合特别有用。

基础语法

Lambda 表达式的完全语法是如下的形式:

[capture](parameter_list) mutable noexcept -> return_type { function_body }

Capture(捕获子句)

此部分用于指定哪些外部局部变量可被 Lambda 表达式访问,并且以什么方式访问。

  • []:不捕获任何外部变量。
  • [=]:以值方式捕获所有外部变量。
  • [&]:以引用方式捕获所有外部变量。
  • [x, &y]:以值方式捕获 x,以引用方式捕获 y

Parameter List(参数列表)

就像常规函数一样,你可以传递参数给 Lambda 函数。

  • ():不接受任何参数。
  • (int x, int y):接受两个整数参数。

Mutable 修饰符

如果你需要修改以值捕获的外部变量,需要用到 mutable

Noexcept 修饰符

指示该 Lambda 表达式是否保证不抛出异常。

Return Type(返回类型)

你可以明确指定返回类型,就像常规函数一样。

  • -> int:返回 int 类型。

Function Body(函数体)

实际执行的代码块。

示例:

一般写法

#include <iostream>

int main() {
int x = 10;
int y = 20;

auto lambda = [x, &y](int a, int b) mutable noexcept -> int {
x = x * 2; // 编译错误,除非使用 mutable
y = y * 2; // 合法,因为 y 是以引用方式捕获的
return a + b + x + y;
};

std::cout << lambda(2, 3) << std::endl; // 输出 57
}

递归写法

function<void(int, int)> dfs = [&](int now, int fa)
{
child[now]++;
for (auto x : v[now])
{
if (x == fa) continue;
dfs(x, now);
child[now] += child[x];
ans[1] += child[it] * (a[x] ^ a[now]) ;
}
};
//有循环报错了
auto dfs = [&](int u, int p, auto&& dfs) -> void
{
for (int v : adj[u])
if (v != p) {
col[v] = col[u] ^ 1;
dfs(v, u, dfs);
}
};