C++lambda表达式

匿名函数

C++在C11标准中引入了匿名函数,即没有名字的临时函数,又称之为lambda表达式.lambda表达式 实质上是创建一个匿名函数/对象

基本格式

[caputrue](params)opt->ret{body;};
[函数对象参数] (操作符重载函数参数) mutable 或 exception 声明 -> 返回值类型 {函数体}
比如说[]() {cout << "hello" << endl; };
对于匿名函数,一般用于传函数参数,当然也可以直接定义调用.

		auto pfun=()[]{cout<<"hello world"<<endl;}		//这里使用auto自动判断类型  其实是函数指针
		pfun();						//调用这个函数

或者直接在这里调用就行 最后的那个()表示调用函数,如果有实参可以放进来.
匿名函数调用

各个部分说明

  1. 函数对象参数(不可省略)

    [] 不截取任何变量
    [&] 截取外部作用域中所有变量,并作为引用在函数体中使用
    [=] 截取外部作用域中所有变量,并拷贝一份在函数体中使用
    [=, &foo] 截取外部作用域中所有变量,并拷贝一份在函数体中使用,但是对foo变量使用引用
    [bar] 截取bar变量并且拷贝一份在函数体重使用,同时不截取其他变量
    [this] 截取当前类中的this指针。如果已经使用了&或者=就默认添加此选项。

  2. 重载参数列表
    调用的时候需要传递的参数(参数可以缺省) 下面调用的时候括号里面的3会赋值给形参x,y用默认值2.

    默认参数是后续引入的,C11不支持,感谢评论区提醒

带参数的匿名函数

  1. 返回类型(可以自动推导 可以省略)
    auto fun = [](int x, int y)->int {cout << x + y << endl; return y;};
    对于这里的->int 这个int就是返回值类型,如果有返回值类型需要在前面加上->
    直接省略写成这种格式也可以[](int x,int y){cout<<x+y<<endl;return y;}

  2. 函数体
    lambda表达式的函数体中可以和普通函数一样写,可以使用捕获的参数,写这个函数实现的具体步骤.

  3. 函数选项opt (可以省略)
    可以填mutable,exception,attribute

    mutable 表示函数体可以修改捕获变量的,同时可以访问捕获对象的非常属性成员函数
    exception说明lambda表达式是否抛出异常以及何种异常
    attribute用来声明属性

  4. 补充说明:
    按值捕获的时候,得到的是当前的值,如果想得到实时的值,建议使用引用

    #include<iostream>
    using namespace std;
    int main()
    {
    	auto ptr = []() {cout << "hello" << endl; };	//lambda表达式
    	ptr();//调用函数
    
    	auto fun = [](int x, int y)->int {cout << x + y << endl; return y;};	//带参数的lambda表达式
    	//  这里的->后面写的是返回值类型
    	auto z=fun(3, 4);
    	cout << z << endl;
    	
    	cin.get();
    	return 0;
    }
    
    
### C++ Lambda 表达式简介 C++11 引入了 lambda 表达式这一特性,使得开发者可以在需要函数的地方直接定义匿名函数对象,而无需单独声明函数。这种机制不仅简化了代码结构,还增强了程序的灵活性[^4]。 #### 基本语法 Lambda 表达式的通用形式如下: ```cpp [capture](parameters) -> return_type { body } ``` - **`capture`**: 定义如何捕获外部作用域中的变量(按值、按引用或其他方式)。 - **`parameters`**: 函数参数列表,类似于普通函数。 - **`return_type`**: 可选部分,默认情况下编译器会推导返回类型。 - **`body`**: 函数体,包含具体的逻辑实现。 --- ### 示例解析 以下是几个典型的 lambda 表达式使用场景及其对应的代码示例。 #### 1. 打印容器中的元素 通过 `std::for_each` 配合 lambda 表达式来遍历并打印向量中的数据。 ```cpp #include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { vector<int> vec = {1, 2, 3, 4, 5}; // 使用 Lambda 表达式打印每个元素 for_each(vec.begin(), vec.end(), [](int x) { cout << x << " "; }); cout << endl; return 0; } ``` 此代码展示了如何利用 lambda 表达式作为回调函数传递给标准库算法 `std::for_each`[^1]。 --- #### 2. 捕获局部变量 Lambda 表达式可以通过 `[ ]` 来捕获上下文中的变量。支持的方式有多种:按值 (`=`),按引用 (`&`) 或显式指定单个变量。 ```cpp #include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { int factor = 2; vector<int> vec = {1, 2, 3, 4, 5}; // 按值捕获变量 'factor' transform(vec.begin(), vec.end(), vec.begin(), [factor](int x) { return x * factor; }); for (auto num : vec) { cout << num << " "; } cout << endl; return 0; } ``` 在此示例中,lambda 表达式捕获了名为 `factor` 的局部变量,并将其用于计算新数组的值[^2]。 --- #### 3. 返回复杂类型的 lambda 表达式lambda 表达式的返回值较为复杂时,可以显式指定其返回类型。 ```cpp #include <functional> #include <iostream> using namespace std; int main() { auto adder = [] (int a, int b) -> int { return a + b; }; cout << adder(3, 4) << endl; // 输出 7 return 0; } ``` 上述代码显示了一个简单的加法操作,其中指定了返回类型为整数型。 --- ### 总结 Lambda 表达式极大地提高了 C++ 编程的便利性和可读性,尤其是在处理 STL 算法或者 GUI 应用开发时尤为有用。它们能够减少不必要的辅助函数定义,使代码更加紧凑高效。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值