[C++11/14新特性] lambda匿名函数用法详解

一、lambda匿名函数

所谓匿名函数,简单地理解就是没有名称的函数,又常被称为 lambda 函数或者 lambda 表达式。
继 Python、Java、C#、PHP 等众多高级编程语言都支持 lambda 匿名函数后,C++11 标准终于引入了 lambda,本节将带领大家系统地学习 lambda 表达式的具体用法。

定义lambda函数的语法格式如下:
[外部变量访问方式说明符] (参数) mutable -> 返回值类型
{
    函数体
}

先看一些比较简单的示例:
[]{
    std::cout << "hello lambda" << std::endl;
};

[]{
    std::cout << "hello lambda" << std::endl;
}();

注意看第一个和第二个  第一个lambda函数没有实际用处  第二个多了一个() 表示调用了该匿名函数

auto I = []{
    std::cout << "hello lambda" << std::endl;
};

I();   //调用了该匿名函数
auto I = ... 表示给lambda函数取什么昵称  方便后续调用

完整形式为 [...](...) mutable throwSpec -> retType {};
1.[...]叫作导入的符号 看到它就知道是lambda表达式了
2.(...)表示参数  因为lambda的行为像函数一样 当然就可以有参数了
3.mutable表示[...]中的数据可不可以被改写
4.throwspec 表示是否可以丢出异常
5.retType 描述lambda的返回类型
6.其中 mutable throwspec retType都是可选的  也可以不写  但只要有一个存在  就需要写()
7.[]中可以填 = 或 &, = 表示传值的方式   &表示传地址符号的方式 相当于取别名

示例一:

#include<iostream>

int main()
{
    int id = 0;
    auto f = [id]() mutable {
        std::cout << "id = " << id << std::endl;
        ++id;
    };

    id = 42;
    f();
    f();
    f();
    std::cout << id << std::endl;

    return 0;
}

1.[id]表示 取外部的变量id 
2.()表示lambda函数没有参数
3.有mutable 表示对值传入外参id可以改变
{...} 表示函数体里面的动作

其实这个匿名函数相当于是一个类
class Functor
{
private:
    int id;
public:
    void operator()(){
        std::cout << "id = " << id << std::endl;
        ++id;
    }
};

Functor f;
f();
这个类中重载了() 所以对象就可以像函数一样调用
为什么打印结果是 0 1 2 42 
把这个匿名函数当作Functor类一样去理解  它有一个传入[id] 等价于值传递  且 id = 0 相当于有一个属于自己'对象'的id,对这个id进行++; 所以分别是 0 1 2

示例二:

#include<iostream>

int main()
{
    int id = 0;
    auto f = [&id](int param)
    {
        std::cout << "id = " << id << std::endl;
        ++id;
        ++param;
    };

    id = 42;
    f(7);
    f(7);
    f(7);
    std::cout << id << std::endl;

    return 0;
}

注意这里是[&id]  所以对id做出改变 再调用匿名函数时  不同于值传递  此时对打印结果有改变的

示例三:

#include<iostream>

int main()
{
    int id = 0;
    auto f = [id](){
        std::cout << "id = " << id << std::endl;
        //++id;  //因为是值传递 所以不能对外部参数做改变 没有加 mutable 时故编译器会报错
    };

    id = 42;
    f();
    f();
    f();
    std::cout << id << std::endl;

    return 0;
}

匿名函数没有加mutable 所以对值传入的外参id修改时 会报错

以上就是lambda匿名函数的用法详解,谢谢大家!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值