📅  最后修改于: 2023-12-03 15:29:53.760000             🧑  作者: Mango
Lambda表达式是C++11中新增的一项特性,它可以让我们更方便地定义匿名函数,并且可以捕获外部变量。本文将介绍Lambda表达式的基本语法和用法。
Lambda表达式的语法形式如下:
[capture list] (parameter list) -> return type {
// lambda function body
};
其中,capture list
(可选部分)用于指定Lambda表达式所能访问的外部变量;parameter list
(可选部分)用于指定参数列表;return type
(可选部分)用于指定返回值类型;lambda function body
(必选部分)用于定义函数体。
举个例子:
int main() {
[] () {
cout << "Hello, world!" << endl;
}();
return 0;
}
输出结果为:
Hello, world!
在这个例子中,我们定义了一个不带参数的Lambda函数,直接在调用后加上一对括号就可以立即执行。
再来一个稍微复杂一些的Lambda函数定义:
int main() {
auto add = [] (int x, int y) -> int {
return x + y;
};
cout << add(1, 2) << endl;
return 0;
}
输出结果为:
3
在这个例子中,我们定义了一个带参数的Lambda函数,并且指定了返回值类型为int
,我们把它赋值给了一个auto
类型的变量add
,然后我们可以像调用普通函数一样调用这个Lambda函数。
Lambda表达式可以捕获外部变量。有3种方式可以指定Lambda表达式所能访问的外部变量:
捕获局部变量可以像下面这样:
int main() {
int x = 10;
auto f = [&x] () {
cout << x << endl;
};
x = 20;
f();
return 0;
}
输出结果为:
20
在Lambda表达式的方括号中,我们使用&x
的方式捕获了变量x
。这意味着Lambda表达式可以访问和修改变量x
的值。
我们也可以捕获传递进来的参数,例如:
int main() {
auto f = [] (int x) {
cout << x << endl;
};
f(10);
return 0;
}
输出结果为:
10
在这个例子中,我们定义了一个带参数的Lambda函数,然后我们把参数10
传递给这个函数。
我们也可以在方括号中使用&
的方式捕获所有的外部变量,例如:
int main() {
int x = 10;
int y = 20;
auto f = [&] () {
cout << x << " " << y << endl;
};
x = 30;
y = 40;
f();
return 0;
}
输出结果为:
30 40
在这个例子中,我们使用了&
的方式来捕获所有的外部变量,这意味着Lambda表达式可以访问和修改所有的外部变量。
Lambda表达式可以解决很多问题,例如:
for_each
函数;std::function
;举个简单的例子,我们可以使用Lambda表达式来排序一个vector:
int main() {
vector<int> v = {3, 1, 4, 1, 5, 9, 2, 6};
sort(v.begin(), v.end(), [] (int x, int y) {
return x < y;
});
for (int i : v) {
cout << i << " ";
}
cout << endl;
return 0;
}
输出结果为:
1 1 2 3 4 5 6 9
在这个例子中,我们使用Lambda表达式作为排序函数的第三个参数,它指定了如何比较两个元素的大小。这样,我们就不需要再定义一个比较函数,从而简化了代码。