zoukankan      html  css  js  c++  java
  • C++ lambda表达式用法

    原文:http://msdn.microsoft.com/en-us/library/dd293599.aspx

    参考:http://www.cnblogs.com/zhuyp1015/archive/2012/04/08/2438176.html

         http://msdn.microsoft.com/en-us/library/dd293603.aspx

    C++11引入了lambda表达式,使得程序员可以定义匿名函数,该函数是一次性执行的,既方便了编程,又能防止别人的访问。

    Lambda表达式的语法通过下图来介绍:

             这里假设我们定义了一个如上图的lambda表达式。现在来介绍途中标有编号的各个部分是什么意思。

    1. Lambda表达式的引入标志,在‘[]’里面可以填入‘=’或‘&’表示该lambda表达式“捕获”(lambda表达式在一定的scope可以访问的数据)的数据时以什么方式捕获的,‘&’表示一引用的方式;‘=’表明以值传递的方式捕获,除非专门指出。
    2. Lambda表达式的参数列表
    3. Mutable 标识
    4. 异常标识
    5. 返回值
    6. “函数”体,也就是lambda表达式需要进行的实际操作

    下面介绍Lambda几种用法:

    1、可以直接给auto变量赋值

    // declaring_lambda_expressions1.cpp
    // compile with: /EHsc /W4
    #include <functional>
    #include <iostream>
    
    int main()
    {
    
        using namespace std;
    
        // Assign the lambda expression that adds two numbers to an auto variable.
        auto f1 = [](int x, int y) { return x + y; };
    
        cout << f1(2, 3) << endl;
    
        // Assign the same lambda expression to a function object.
        function<int(int, int)> f2 = [](int x, int y) { return x + y; };
    
        cout << f2(3, 4) << endl;
    }

    输出结果为:5  7

    2、可以使用传值或引用来“捕获”数据,i采用传值来捕获,所以再次赋值不会改变表达式的运算结果

    // declaring_lambda_expressions2.cpp
    // compile with: /EHsc /W4
    #include <functional>
    #include <iostream>
    
    int main()
    {
       using namespace std;
    
       int i = 3;
       int j = 5;
    
       // The following lambda expression captures i by value and
       // j by reference.
       function<int (void)> f = [i, &j] { return i + j; };
    
       // Change the values of i and j.
       i = 22;
       j = 44;
    
       // Call f and print its result.
       cout << f() << endl;
    }

    输出结果:67(相当于44+3);

    3、通过给Lambda表达式传递参数,立即调用Lambda表达式

    // calling_lambda_expressions1.cpp
    // compile with: /EHsc
    #include <iostream>
    
    int main()
    {
       using namespace std;
       int n = [] (int x, int y) { return x + y; }(5, 4);
       cout << n << endl;
    }

    4、将Lambda表达式作为函数的参数

    // calling_lambda_expressions2.cpp
    // compile with: /EHsc /W4
    #include <list>
    #include <algorithm>
    #include <iostream>
    
    int main()
    {
        using namespace std;
    
        // Create a list of integers with a few initial elements.
        list<int> numbers;
        numbers.push_back(13);
        numbers.push_back(17);
        numbers.push_back(42);
        numbers.push_back(46);
        numbers.push_back(99);
    
        // Use the find_if function and a lambda expression to find the 
        // first even number in the list.
        const list<int>::const_iterator result = 
            find_if(numbers.begin(), numbers.end(),[](int n) { return (n % 2) == 0; });
    
        // Print the result.
        if (result != numbers.end()) {
            cout << "The first even number in the list is " << *result << "." << endl;
        } else {
            cout << "The list contains no even numbers." << endl;
        }
    }

    输出:The first even number in the list is 42.

    5、支持嵌套调用

    // nesting_lambda_expressions.cpp
    // compile with: /EHsc /W4
    #include <iostream>
    
    int main()
    {
        using namespace std;
    
        // The following lambda expression contains a nested lambda
        // expression.
        int timestwoplusthree = [](int x) { return [](int y) { return y * 2; }(x) + 3; }(5);
    
        // Print the result.
        cout << timestwoplusthree << endl;
    }

    输出结果:13

    6、higher-order function

    // higher_order_lambda_expression.cpp
    // compile with: /EHsc /W4
    #include <iostream>
    #include <functional>
    
    int main()
    {
        using namespace std;
    
        // The following code declares a lambda expression that returns 
        // another lambda expression that adds two numbers. 
        // The returned lambda expression captures parameter x by value.
        auto addtwointegers = [](int x) -> function<int(int)> { 
            return [=](int y) { return x + y; }; 
        };
    
        // The following code declares a lambda expression that takes another
        // lambda expression as its argument.
        // The lambda expression applies the argument z to the function f
        // and multiplies by 2.
        auto higherorder = [](const function<int(int)>& f, int z) { 
            return f(z) * 2; 
        };
    
        // Call the lambda expression that is bound to higherorder. 
        auto answer = higherorder(addtwointegers(7), 8);
    
        // Print the result, which is (7+8)*2.
        cout << answer << endl;
    }

    7、在方法内使用Lambda表达式

    void ApplyScale(const vector<int>& v) const
    {
       for_each(v.begin(), v.end(), 
          [this](int n) { cout << n * _scale << endl; });
    }

    或者

    void ApplyScale(const vector<int>& v) const
    {
       for_each(v.begin(), v.end(), 
          [=](int n) { cout << n * _scale << endl; });
    }

    8、和模板一起使用

    // template_lambda_expression.cpp
    // compile with: /EHsc
    #include <vector>
    #include <algorithm>
    #include <iostream>
    
    using namespace std;
    
    // Negates each element in the vector object. Assumes signed data type.
    template <typename T>
    void negate_all(vector<T>& v)
    {
        for_each(v.begin(), v.end(), [](T& n) { n = -n; });
    }
    
    // Prints to the console each element in the vector object.
    template <typename T>
    void print_all(const vector<T>& v)
    {
        for_each(v.begin(), v.end(), [](const T& n) { cout << n << endl; });
    }
    
    int main()
    {
        // Create a vector of signed integers with a few elements.
        vector<int> v;
        v.push_back(34);
        v.push_back(-43);
        v.push_back(56);
    
        print_all(v);
        negate_all(v);
        cout << "After negate_all():" << endl;
        print_all(v);
    }

    输出结果:

    34
    -43
    56
    After negate_all():
    -34
    43
    -56
    9、处理异常
    // eh_lambda_expression.cpp
    // compile with: /EHsc /W4
    #include <vector>
    #include <algorithm>
    #include <iostream>
    using namespace std;
    
    int main()
    {
        // Create a vector that contains 3 elements.
        vector<int> elements(3);
    
        // Create another vector that contains index values.
        vector<int> indices(3);
        indices[0] = 0;
        indices[1] = -1; // This is not a valid subscript. It will trigger an exception.
        indices[2] = 2;
    
        // Use the values from the vector of index values to 
        // fill the elements vector. This example uses a 
        // try/catch block to handle invalid access to the 
        // elements vector.
        try
        {
            for_each(indices.begin(), indices.end(), [&](int index) { 
                elements.at(index) = index; 
            });
        }
        catch (const out_of_range& e)
        {
            cerr << "Caught '" << e.what() << "'." << endl;
        };
    }

    输出结果:Caught 'invalid vector<T> subscript'.

     
  • 相关阅读:
    vim删除以#,空格开头的行
    Element-ui 中对表单进行验证
    VUE页面实现加载外部HTML方法
    vue-cli2嵌入html
    文字环绕图片
    LocalDate计算两个日期相差天数
    springboot+vue脚手架使用nginx前后端分离
    通过 Netty、ZooKeeper 手撸一个 RPC 服务
    Spring Native 项目,把 Spring 项目编译成原生程序!
    印象笔记吐槽
  • 原文地址:https://www.cnblogs.com/jianxingzhe/p/4074648.html
Copyright © 2011-2022 走看看