lambda表达式

lambda表达式什么?

lambda表达式,也被称为匿名函数,是一种简洁的、灵活的函数表示方法,它基于数学中的λ演算(lambda calculus)得名。在编程中,lambda表达式允许我们定义一个没有名字的函数,并可以将其作为一个参数传递给其他函数,或者赋值给一个变量。

它包含捕获列表、参数列表、表达式和语句,常用于一次性操作或作为函数参数传递。

lambda表达式基本语法如下:

[capture](parameters)->return_type{body_of_lambda}

  • capture:捕获列表,用于捕获外部作用域中的变量,使外部作用域的变量在lambda函数体内可见
  • capture常见的是默认捕获,即[],表示不指定任何捕获方式,编译器自动捕获;除此之外,[=]表示lambda表达式按值捕获,lambda函数体内不可修改;[&]表示lambda表达式按引用捕获,修改会影响原值;
  • parameters:lambda函数的参数列表,类似于普通函数参数列表
  • return_type:lambda函数的返回类型,编译器自动推断,可省略

 lambda表达式经典案例

1、lambda表达式作为匿名函数传递给变量sum
#include <iostream>

using namespace std;

int main()
{
   auto sum=[](int a,int b)->int{
       return a+b;
   };
   int result=sum(6,6);
   cout<<"result的输出结果:"<<result<<endl;
    return 0;
}

输出结果:

 2、lambda表达式作为函数对象传递给STL算数生成算法accumulate(返回函数对象)
#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;

int main()
{
    std::vector<int> num={0,1,2,3,4,5};
    int sum=std::accumulate(num.begin(),num.end(),0,[](int a,int b){
        return a+b;
    });
    cout<<"sum的值:"<<sum<<endl;
    return 0;
}

输出结果:

3、lambda表达式与STL标准函数对象一起使用(回调函数)
#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;

int main()
{
    std::vector<int> num={0,1,2,3,4,5};
    for_each(num.begin(),num.end(),[=](int value){
        cout<<value<<" ";
    });
    cout<<endl;

    std::sort(num.begin(),num.end(),[](int a,int b){
        return a>b;
    });
    for_each(num.begin(),num.end(),[=](int value){
        cout<<value<<" ";
    });
    cout<<endl;

    return 0;
}

输出结果:

4、 lambda表达式捕获变量
#include <iostream>

using namespace std;

int main()
{
    int factor=6;
    auto multiply=[&factor](int a){
        return a*factor;
    };
    int result=multiply(6);
    cout<<"result的输出结果:"<<result<<endl;

    return 0;
}

输出结果:

4.1、 lambda表达式捕获变量的进阶(返回函数对象)

高阶函数返回函数对象,在需要创建函数工厂或策略模式时特别好用

#include <iostream>
#include <functional>
using namespace std;

function<void(int)> createMultiplier(int factor){
    return [factor](int value){
        cout<<"调用函数对象输出结果:"<<value*factor<<endl;
    };
}

int main()
{
    //创建一个乘以2的函数对象
    auto doubleFactor=createMultiplier(2);

    //调用函数对象
    doubleFactor(6);

    return 0;
}

输出结果:

5、 lambda表达式作为构造自定义函数对象

lambda表达式作为构造自定义函数对象因其复杂度高,且c++11之后版本做了改进,不需要显式地创建自定义对象,有点鸡肋,了解。

#include <functional>
using namespace std;

struct MyFunctionObject{
    MyFunctionObject(const function<void(int)>& func):func_(func){}
    void operator()(int value) const{
        func_(value);
    }

private:
    function<void(int)> func_;
};

int main()
{
    //使用lambda表达式初始化自定义函数对象
    MyFunctionObject myFuncObj([](int number){
        cout<<"我被调用:"<<number<<endl;
    });

    //传参调用自定义函数对象
    myFuncObj(666);

    return 0;
}

输出结果:

其他

accumulate算法

accumulate算法用来计算容器元素的累计总和

accumulate表达式如下:

accumulate(iterator begin,iterator end,value)

accumulate(iterator begin,iterator end,value,二元操作函数或函数对象)

  • iterator begin:输入迭代器的起始位置(first)
  • iterator end:输入迭代器的结束位置(last)
  • value:累积初始值
  • 二元操作函数或函数对象:accumulate函数接受第四个参数用于定义如何累积元素
[=]、[&]的混合应用
#include <iostream>

using namespace std;

int main()
{
    string x="你好,C++";
    int y=11;
    cout<<x<<y<<endl;

    auto lambda=[x,&y](){
        y=24;
        cout<<x<<y<<endl;
    };

    //调用lambda表达式
    lambda();

    return 0;
}

输出结果:

tips

需要注意的是lambda表达式的return_type如果没有省略,表达式前面也可以不加指向运算符->;

λ演算是一种用于研究函数定义、函数应用和递归的形式系统。λ演算中的基本元素是lambda抽象(lambda abstraction),它允许你定义一个匿名函数,即没有名字的函数;

高阶函数:在c++中通常指接受函数对象(包括lambda表达式)作为参数,或者返回函数对象的函数。

  • 9
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值