• C++ fubction函数和lambda函数


    functiona函数介绍

    std::function是一个函数包装器模板,来自fubctional库。该函数包装器模板能包装任何类型的可调用元素(callable element),例如普通函数和函数对象。

    包装器对象可以进行拷贝,并且包装器类型仅仅只依赖于其调用特征(call signature),而不依赖于可调用元素自身的类型。

           一个std::function类型对象实例可以包装下列这几种可调用元素类型:函数、函数指针、类成员函数指针或任意类型的函数对象(例如定义了operator()操作

    并拥有函数闭包)。std::function对象可被拷贝和转移,并且可以使用指定的调用特征来直接调用目标元素。

    当std::function对象未包裹任何实际的可调用元素,调用该std::function对象将抛出std::bad_function_call异常。

    头文件包含在#include<functional>里面

    functiona函数使用

    和vector的使用类似,std::function<函数返回类型(参数1类型,参数2类型,.......)>  包装后的函数名称

    #include<functional>
    
    int fun1(int n, int m)
    {
    
        return n + m;
    }
    
    void fun2(int n)
    {
        printf("fun2
    ");
    }
    
    int main()
    {
        std::function<int(int, int)> call1 = fun1;
        int ans = call1(1, 2);
        printf("%d
    ", ans);
    
        std::function<void(int)> call2 = fun2;
        call2(3);
    
        return 0;
    }

    lambda函数

    上面用function去封装普通函数可能还看不出来使用function函数的意义,现在在介绍一下封装lambda表达式,更好理解function函数

    C++11提供了对匿名函数的支持,称为Lambda函数(也叫Lambda表达式),还有一个名字式匿名函数,它有四部组成,分别是:

     lambda表达式 拉曼达表达式 匿名函数


    [ caputrue ] ( params ) opt -> ret { body; };

    [ 外部变量捕获列表 ] ( 参数表 ) 特殊操作符 -> 返回值类型 { 函数体; };

    捕获列表:lambda表达式的捕获列表精细控制了lambda表达式能够访问的外部变量,以及如何访问这些变量。

    1) []不捕获任何变量。

    2) [&]捕获外部作用域中所有变量,并作为引用在函数体中使用(按引用捕获)。

    3) [=]捕获外部作用域中所有变量,并作为副本在函数体中使用(按值捕获)。

    4) [=, &foo]按值捕获外部作用域中所有变量,并按引用捕获foo变量。

    5) [bar]按值捕获bar变量,同时不捕获其他变量。

    6) [this]捕获当前类中的this指针,让lambda表达式拥有和当前类成员函数同样的访问权限。

    如果已经使用了&或者 = ,就默认含有此选项。

    捕获this的目的是可以在lamda中使用当前类的成员函数和成员变量。


    1).capture是捕获列表;

    2).params是参数表;(选填)

    3).opt是函数选项;可以填mutable,exception,attribute(选填)

    mutable说明lambda表达式体内的代码可以修改被捕获的变量,并且可以访问被捕获的对象的non-const方法。

    exception说明lambda表达式是否抛出异常以及何种异常。

    attribute用来声明属性。

    4).ret是返回值类型。(选填)

        int n = 5;
        //匿名函数
        function call=[n/*外部变量捕获列表*/](/*参数列表*/int a,int b) -> int/*返回值类型*/
        {
            //函数体
            printf("%d
    ",n+a+b);
            return 2;
        };

    lambda函数是通常和function函数一起使用,function函数定义一个封装函数的变量名称,lambda实现函数的封装,这样配合使用可以减少函数指针的使用以及资源的消耗,达到将一个函数当成一个变量去传参、储存,同时还能实现函数功能的效果

    #include<functional>
    #include<iostream>
    #include<vector>
    using namespace std;
    typedef function< void() > fun;
    vector<fun>p;
    void GetSum(int x, int y)
    {
        cout << x + y << endl;
    }
    void add(fun fun1)
    {
        p.push_back(fun1);
    }
    
    int main()
    {
        int n;
        cin >> n;
    
        for (int i = 0; i < n; i++)
        {
            int x, y;
            cin >> x >> y;
            add([x, y]() {GetSum(x, y); });
        }
        for (int i = 0; i < n; i++)
        {
            p[i]();
        }
        system("pause");
        return 0;
    }

    functiona函数使用

  • 相关阅读:
    桥接模式
    单例模式
    迭代器模式
    组合模式
    备忘录模式
    适配器模式
    状态模式
    观察者模式
    golang 字符串统计
    go bytes缓冲区使用介绍 -转自https://www.cnblogs.com/--xiaoyao--/p/5122138.html
  • 原文地址:https://www.cnblogs.com/-citywall123/p/12765988.html
Copyright © 2020-2023  润新知