C++ Lamda表达式

Lambda是C++11增加的特性,利用Lambda表达式,可以创建匿名函数。

1.声明Lambda表达式
完整的声明格式:[capture list] (params list) mutable exception -> return type { function body}

  • capture list:捕获外部变量列表
  • params list:形参列表
  • mutable指示符:用来说明是否可以修改捕获的变量
  • exception:异常设定
  • return type:返回类型
  • function body:函数体

常见声明:

格式说明
[]{function body}最简单的lambda表达式
[capture list](params list) -> return type {function body}const类型的表达式,函数体中不能修改捕获列表中的值
[capture list](params list) {function body}省略了返回值,编译器自行判断:1)如果函数体中存在return语句,则返回类型由return语句中的返回类型确定;2)如果函数体中没有return语句,返回值为void型
[](params list) -> return type{function body}省略了捕获列表
[capture list] ()-> return type {function body}省略了形参列表,类似无参函数
  • 注意:如果mutable,exception,return type三者只要一种出现,小括号()不可省略,均不出现则可省略。

简单应用举例:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

bool cmp(int a, int b)
{
    return a < b;
}

int main()
{
    vector<int>vec1{ 12,36,25,47,84,13,26,45,81,21 };
    vector<int>vec2(vec1);
    for (auto i : vec1)
    {
        cout << i << " ";
    }
    cout << endl;

    sort(vec1.begin(), vec1.end(), cmp);
    for (auto i : vec1)
    {
        cout << i << " ";
    }
    cout << endl;

    sort(vec2.begin(), vec2.end(), [](int a, int b)->bool {return a < b; });
    for (auto i : vec2)
    {
        cout << i << " ";
    }
    cout << endl;
    return 0;
}

2.捕获外部变量

//值捕获
int a = 123;
auto f1 = [a]{cout << a << endl; }; //值捕获外部变量a,类似值传递
cout << "a=" << ++a << endl;    //输出a=124
cout << "in lambda expr f1,a=";
f1();   //输出123
cout << endl;

a = 123;
//auto f2 = [a] {cout << ++a << endl; }; //由于是const表达式,所以函数体中不能修改捕获的外部变量
auto f2 = [a]()mutable {cout << ++a << endl; };  //mutable指明可以在函数体中修改外部变量的值
cout << "a=" << ++a << endl;
cout << "in lambda expr f2,a=";
f2();   //输出124
cout << endl;

//引用捕获
int b = 456;
auto f3 = [&b] {cout << b << endl; }; //引用捕获外部变量b,类似引用传递
cout << "b=" << ++b << endl;
cout << "in lambda expr f3,b=";
f3();   //输出457
cout << endl;

b = 456;
//auto f4 = [b] {cout << ++b << endl; }; //由于是const表达式,所以函数体中不能修改捕获的外部变量
auto f4 = [&b]()mutable {cout << ++b << endl; };  //mutable指明可以在函数体中修改外部变量的值
cout << "b=" << ++b << endl;
cout << "in lambda expr f4,b=";
f4();   //输出458
cout << endl;

//隐式值捕获
int c = 123;
auto f5 = [=] {cout << c << endl; };
cout << "in lambda expr f5,c=";
f5();    //输出123

//隐式引用捕获
int d = 456;
auto f6 = [&] {cout << d << endl; };
d++;
cout << "in lambda expr f6,d=";
f6();   //输出457


其他捕获外部变量形式:

  • [this],以值的形式捕获this指针
  • [x,&y,=],x以值的形式捕获,y以引用的形式捕获,其他变量以值的形式捕获
  • [x,&y,&],x以值的形式捕获,y以引用的形式捕获,其他变量以引用的形式捕获

3.函数参数

int a = 5, b = 3;
cout << a << "+" << b << "=" << [](int x, int y) {return x + y; }(a, b) << endl;    //这里给了参数,所以返回的是值
cout << a << "+" << 12 << "=" << [](int x, int y = 12) {return x + y; }(a) << endl; //参数列表有默认参数

cout << [](int x) {return [](int y) {return y * 3; }(x)+8; }(a) << endl;    //嵌套lambda表达式

auto f1 = [](int x)->function<int(int)> {return [=](int y) {return x + y; }; }; //返回lambda表达式
auto f2 = f1(4);
cout << f2(5) << endl;

auto f3 = [](const function<int(int)>& f, int z) {return f(z) + 3; };   //lambda表达式做参数
cout << f3(f1(7), 8) << endl;


 

参考博客:https://www.cnblogs.com/DswCnblog/p/5629165.html

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值