C++的lambda表达式
lambda是匿名函数。
C++的lambda表达式
lambda
lambda
表达式是C++11引入的新特性,它是一种匿名函数,具有简洁、高效和功能强大的特点,通常用于简化代码,尤其是在处理临时或小型回调函数时。
语法:
1
[捕获列表](形式参数) ->返回类型 { 函数体 }
捕获列表(capture list),用于捕获 lambda 表达式外部范围内的变量,逗号分隔。变量可以按值捕获(=)或按引用捕获(&)。
形式参数,同普通函数的形参。
返回类型(return type),用于指明返回值类型,void、int、std::string等。
函数体,同普通函数的函数体。
捕获列表
[] 不捕获任何变量;
[=] 按值捕获所有变量,按值捕获的变量不允许修改;
[&] 按引用捕获所有变量;
[a] 仅以值捕获a,其它变量不捕获;
[&a] 仅按引用捕获a,其它变量不捕获;
[a, b] 仅以值捕获a和b,其它变量不捕获;
[a, &b] 按值捕获a,以引用捕获b,其它变量不捕获;
[&a, &b]
[=, &a]
[&, a]
[&, a, b] 以引用捕获所有变量,但是a和b除外,它们通过值捕获;
[this] 通过引用捕获当前对象(其实是复制指针);
[*this] 按值捕获当前对象。
mutable
mutable
关键字,可以使lambda表达式修改
按值捕获的变量。这里的修改
是改变lambda中按值捕获的局部变量,不会影响原始变量。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
int main()
{
int x = 5;
// [x](){ x = 7; }; // error
auto lambda = [x]() mutable {
x++;
std::cout << "x: "<< x << std::endl;
};
lambda(); // x: 6
lambda(); // x: 7
std::cout << "x: "<< x << std::endl; // x: 5
return 0;
}
最简单的lambda
lambda表达式由 [](){} 构成。没有形参时,可以省略 ()。
1
2
3
4
5
int main()
{
[]{}; // 什么都不做
return 0;
}
lambda做函数参数
lambda做函数参数,其实就是函数做为参数,只不过这里的函数是匿名函数。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <vector>
void ForEach1(std::vector<int>& values, void(*func)(int))
{
for(int v : values)
func(v);
}
#include <functional>
void ForEach2(std::vector<int>& values, const std::function<void(int)>& func)
{
for(int v : values)
func(v);
}
int main()
{
std::vector<int> values = {1, 2, 5, 4, 3};
ForEach1(values, [](int v){ std::cout << v << std::endl;});
ForEach2(values, [=](int v){ std::cout << "v: " << v << std::endl;});
return 0;
}
本文由作者按照 CC BY 4.0 进行授权