C++11引入了lambda表达式,它是一个匿名函数对象,可以在代码中被直接定义和使用。lambda表达式的格式如下:
[capture list] (parameters) -> return type { function body }
其中,capture list
指定了lambda表达式中所使用的外部变量,可以使用[]
来表示不捕获任何外部变量,也可以使用&
或=
来捕获所有外部变量,具体用法如下:
[]
:不捕获任何外部变量。[variable]
:捕获变量variable
,但不改变其值。如果该变量为值类型,则会进行复制;如果为引用类型,则会保留对原变量的引用。[&]
:捕获所有外部变量,并将它们作为引用传递。[=]
:捕获所有外部变量,并将它们作为值传递。如果要修改某个变量的值,则需要使用mutable
关键字。[&, variable]
:捕获所有外部变量,并将它们作为引用传递,但除了变量variable
以外,其他变量都是值传递。[=, &variable]
:捕获所有外部变量,并将它们作为值传递,但除了变量variable
以外,其他变量都是引用传递。
parameters
指定了lambda表达式的参数列表,与普通函数的参数列表类似。
return type
指定了lambda表达式的返回类型,如果省略则会根据函数体自动推断出返回类型。
function body
是lambda表达式的函数体,与普通函数的函数体类似。
以下是一个使用lambda表达式的示例:
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> numbers{3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};
// lambda表达式:从小到大排序
std::sort(numbers.begin(), numbers.end(),
[](int a, int b) { return a < b; });
// lambda表达式:输出所有奇数
std::for_each(numbers.begin(), numbers.end(),
[](int n) { if (n % 2 != 0) std::cout << n << " "; });
return 0;
}
在这个示例中,我们使用了两个lambda表达式。第一个表达式用于对vector进行从小到大的排序;第二个表达式用于输出所有奇数。
C/C++Linux服务器开发/架构师面试题、学习资料、教学视频和学习路线图,免费分享有需要的可以自行添加学习交流群739729163 领取