C++的Lambda表达式

介绍

从C++11开始引入了lambda表达式,结合其他语言的定义,Lambda表达式,也被称之为匿名函数,可以实现类似的函数的功能,实现函数式编程的概念,是现代编程语言的特点之一,可以与操作符重载括号得到的伪函数关联记忆。具体的定义方法如下。既然是对象自然也就可以new出来内存空间(区分Java,可不是对象😂)

1
auto 对象名 = [捕获列表](参数列表){函数体};

说说λ

从一段简单的代码说起,根据面向对象的概念lambda表达式也是一种对象,它的类型是auto,所以它的语法要这么写。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;

int main()
{
//lambda表达式
auto lambda = []() {
cout << "hello world" << endl;
};
lambda();
}
//-------------------------------------
控制台输出:
hello world

含参类型的lambda可以通过仿函数的写法调用,具体实现可以用操作符重载实现,这里简单写一写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;

int main()
{
//lambda表达式
auto lambda = [](int a,int b) {
cout << "结果为:" << a+b << endl;
};
lambda(1,2);
}
//--------------------------------------
控制台输出:
3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
using namespace std;

class lambda {
public:
lambda(int a,int b) {
this->a = a;
this->b = b;
}
void operator()() {
cout << "加和为:" << this->a+this->b << endl;
}
private:
int a;
int b;
};
int main()
{
//差不多是这个意思
lambda m(2,3);
m();
}

既然lambda可以无名使用,auto的存在也就没那么重要了,也就是可以省略。而表达式内需要用到参数的就要在小括号内加入参数,方括号内的是执行捕获列表,常用的有&引用捕获、=复制捕获、this指针捕获。

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <iostream>
using namespace std;

int main()
{
//等待捕获的变量
int x = 1;
int y = 2;
//不同类型的捕获,结果不同
auto lambda1 = []() {
cout << "空捕获" << endl;
};
auto lambda2 = [=]() {
cout << "=捕获" << x << y << endl;
};
auto lambda3 = [&]() {
cout << "&捕获" << x << y << endl;
};
auto lambda4 = [&x]() {
cout << "&x捕获" << x << endl;
};
auto lambda5 = [&y]() {
cout << "&y捕获" << y << endl;
};
auto lambda6 = [x,y]() {
cout << "x,y捕获" << x << y << endl;
};
auto lambda7 = [&x,y]() {
cout << "&x,y捕获" << x << y << endl;
};
auto lambda8 = [x, &y]() {
cout << "x,&y捕获" << x << y << endl;
};
lambda1();
lambda2();
lambda3();
lambda4();
lambda5();
lambda6();
lambda7();
lambda8();
}
//------------------------------------------
输出控制台:
空捕获
=捕获12
&捕获12
&x捕获1
&y捕获2
x,y捕获12
&x,y捕获12
x,&y捕获12

方括号内的格式,决定了匿名函数外部的变量是否可以被函数内部访问到,留空意味什么都不捕获,=就是复制一份访问不可修改,&就是引用变量可以修改。

在多线程中,也可以使用lambda创建线程,写法简便

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <Thread>
using namespace std;

int main()
{
//Thread
thread thread1([] {
//通过lambda创建线程对象.
cout << "thread1" << endl;
});

thread1.join();
}
//--------------------------------
thread1

结束


C++的Lambda表达式
https://blog.minloha.cn/posts/190503b9a978c82022020543.html
作者
Minloha
发布于
2022年2月5日
更新于
2023年12月21日
许可协议