zoukankan      html  css  js  c++  java
  • 由python为入口回顾C++的lambda

    lambda是一种匿名函数,python  lambda可以使简单的函数简洁的表达,,C++的lambda使类似嵌套函数的功能得以实现

    python的lambda

    lambda [arg1[,arg2,arg3....argN]]:expression
    
    #用def定义的函数
    def foo():
        return 'hello world'
    print(foo())
    #用lambda定义的函数
    print(lambda:'hello world')
    #因为没有给它保存到变量,用完后就失效了,提高了性能
    foo_1=lambda:'hello world'
    print(foo_1())
    #加参数
    foo_3=lambda a,b=10:a+b
    print(foo_3(20,10))
    foo_4=lambda *args:args
    print(foo_4(1,2,3,4))
    #lambda表达式必须在一行,python一行写不下可以用换行
    foo_5=lambda **kwargs:
    kwargs
    print(foo_5(a=1,b=2,c=3))
    #还可以变量间赋值
    foo_2=foo_1
    print(type(foo_2))

    C++的lambda

    直接使用,对于一些不重复使用的函数,使用完了自动丢弃

    int result = [](int a) {return a*a; }(10);
    cout << result << endl;

    如果要反复利用,可以使用变量来存储

    auto pow_2 = [](int a) {return a*a; };
    cout << pow_2(10) << endl;

    lambda的类型

    cout << typeid(pow_2).name() << endl;      //类型是class <lambda_a10bdd2a3443eccb15c2cfee0f251b1b>

    lambda结构

    1. Capture 子句(在 C++ 规范中也称为 lambda 引导。)

    2. 参数列表(可选)。 (也称为 lambda 声明符)

    3. 可变规范(可选)。

    4. 异常规范(可选)。

    5. 尾随返回类型(可选)。

    6. “lambda 体”

    1,lambda引导

    位置可传入外部参数,可以通过传值或传址方式直接传入外部数据

    [&] 通过引用传入外部所有变量(地址不会变),[=]通过数值传入外部所有变量,[i]指定变量传值,[&i]指定变量传址

    int i = 10;
    int front = (int)&i;            //front是i的地址
    cout << i << "-->" << front << endl;    //输出这次地址
    cout << &front << endl;            //查看front的地址
    auto func_1 = [i,&front] {                //传入i(传值)和front(传址)
        int back = (int)&i; 
        cout << i << "-->" << back <<            //输出这次地址
            "
    back-front=" << abs(back - front) << endl;
        cout << &front << endl;            //再次查看front地址
    };
    func_1();
    //得出
    /*
    10-->7601564     第一次的i
    0073FD90            第一次的front
    10-->7601536     第二次的i
    back-front=28
    0073FD90           第二次的front
    */
    struct S { void f(int i); };
    
    void S::f(int i) {
        [&, i]{};    // 在所有都为引用的时候,可以指定一个不为引用
        [&, &i]{};   // 当默认全部引用的时候,不能在指定i为引用
        [=, this]{}; // ERROR: this when = is the default
        [i, i]{};    // 变量不能重复
    }

    2,参数列表,auto使用泛型值,或者指定类型

    char* a = "aaa";
    char* b = "bbb";
    [](auto& a, auto& b) {
        auto temp = a;
        a = b;
        b = temp;
    }(a,b);
    cout << a <<" "<< b << endl;

    3,可变规范

    一般情况下,通过传值获得的变量不能修改

    int n = 0;
    [&, n]() {++n; }();
    //提示错误:“n”: 无法在非可变 lambda 中修改通过复制捕获

    mutable规范允许lambda中修改n的值,由于n是通过值捕获,在lambda结束后,n的值不会变

    int m = 0;
    int n = 0;
    [&, n](int a)mutable {m = ++n + a; }(4);
    cout << m << " " << n << endl;
    5
    0

    4,异常规范

    5,返回值由char*变成string

    char a[10] = "aaa";
    char* b = "bbb";
    auto merge_str=[](char* a, char* b)->string{
        char* result = strcat(a, b);
        return result;
    };
    cout << merge_str(a, b)<<"-->"<<typeid(merge_str(a, b)).name() << endl;

    6,lambda体,可放入任意代码块

    lambda表达式赋值方法:

    //1,可赋值给auto变量
    auto f1 = [](int x, int y) {return x + y; };
    cout << f1(1,2) << endl;
    //2,可赋值给函数对象
    function<int(int, int)>f2 = [](int x, int y) {return x + y; };
    cout << f2(3,4) << endl;
    3
    7

    find_if()  参数一:迭代器头部  参数二:迭代器尾部  参数三,返回一个指针  返回值:找到的元素的指针

    vector<char*>v1 = { "aaa","bbb","ccc","ddd","eee" };
    auto result=
    find_if(v1.begin(), v1.end(), [](char* n) { return n=="ccc"; });
    cout << *result << endl;
    ccc

    lambda嵌套

    int result = [](int x) {return [&x](int y) {return (x + y); }(10); }(20);
    cout << result << endl;
    30
  • 相关阅读:
    工业设计之美
    狠挖用户需求与用户分析——赫志中
    《必然》
    在一周内学会使用 AUTO CAD
    可控硅调光知识总结
    PADS Logic Decal、Layout Decal绘制
    BUCK-BOOST反激变压器设计
    RCC BUCK-BOOST变压器设计
    产品生产
    由《旧制度与大革命》提取的5个感触
  • 原文地址:https://www.cnblogs.com/euewrqe/p/5724353.html
Copyright © 2011-2022 走看看