C++ Lambda表达式详解

本文深入探讨C++中的Lambda表达式,一种用于创建匿名函数的强大特性,详细讲解其语法和使用场景,包括如何用于排序和过滤操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Lambda表达式概述:用于创建匿名的函数对象,用于简化编程工作。

通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数。

语法形式如下:
[函数对象参数] (操作符重载函数参数)mutable或exception声明 ->返回类型{函数体}

1.函数对象参数
    标示一个Lambda表达式的开始,必须存在,不能省略。函数参数对象只能使用那些定义Lambda
为止时Lambda所在作用范围内可见的局部变量(包含Lambda所在类的this)
    (1)[]:没有任何函数参数对象
    (2)[=]:以值传递方式捕获Lambda所在范围内的所有局部变量。
    (3)[&]:以引用传递方法捕获Lambda所在范围内的所有局部变量。
    (4)this:函数体可以使用Lambda所在类的成员变量。
    (5)[x,&y]:x以值传递捕获,y以引用形式捕获。
    (6)[=,&z]:z以引用形式捕获,其他变量以值传递捕获。
    (7)[&,x]:x以值传递形式捕获,其他变量以引用形式捕获。

2.操作符重载函数参数
  参数列表,标识重载的()操作符,没有参数时,可以省略。参数可以使用值传递和引用传递。

3.mutable或者exception声明
  可以省略。按函数参数按值传递时,加上mutable修饰后,可以修改传递进来的拷贝。
  exception声明用于指定函数抛出的异常,可以使用throw(int)。

4.-> 返回值类型
  标识函数返回值的类型,当返回值为void,或者函数体中只有一处return的地方时,这部分可以省略。

5.函数体
  标识函数的实现,不能省略,函数体可以为空。

示例
[](int x,int y) {return x+y;}  隐式返回类型
[](int& x) {++x;}  没有return语句,Lambda的函数返回类型为 'void'
[]() {++num}  没有参数,访问全局变量num
[] {++num}  省略参数

来看一个实例:

bool cmp(int &a, int &b)
{
    ruturn a > b;
}
int main()
{
    vector<int> data;
    for (int i = 0; i < 5; i++)
        data.push_back(i);
    sort(data.begin(), data.end(), cmp);
    for (int i = 0; i < data.size(); i++)
        cout << data[i] << endl;
    return 0;
}

       上述代码中:对data中的元素进行排序后输出,algorithm库中默认的sort采用升序排列,当我们想用降序排列时需要添加一个比较函数cmp,作为参数传递给sort。在定义了函数bool cmp(int &a,int &b)后,我不能再用bool cmp(int &a,int &b)来定义其他的比较函数,比如:

bool cmp(int &a,int &b)
{
    return (a%3)>(b%3);
}

当一个程序中,排序函数用的次数不多时,专门给排序函数起个名字污染命名空间似乎不合算,能不能不给它起cmp的名字,又能使用比较大小的功能呢?此时就需要用到匿名函数了。

int main()
{
    vector<int> data;
    for (int i = 0; i < 5; i++)
        data.push_back(i);
    sort(data.begin(), data.end(), [](int &a,int &b)->bool
    {
        return a>b;
    });
    for (int i = 0; i < data.size(); i++)
        cout << data[i] << endl;
    return 0;
}

其中

[](int &a,int &b)->bool{return a>b;}

就是Lambda表达式。假如有数组data,想生成保留偶数的新数组,代码如下:

int main()
{
    vector<int> data;
    vector<int> result;
    for (int i = 0; i < 5; i++)
        data.push_back(i);
    for_each(data.begin(), data.end(), [&result](int &elem) {
        if (elem % 2 == 0)
        {
            retult.push_back(elem);
        }
    });
    for_each(result.begin(), result.end(), [](int &elem) {
        cout << elem << endl;
    });
    return 0;
}

参考:https://www.cnblogs.com/jimodetiantang/p/9016826.html

           https://www.jianshu.com/p/96e9dba6e7a9

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酷小川

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值