1. 程式人生 > >c++ lambda表示式常用的情形

c++ lambda表示式常用的情形

lambda表示式介紹

  • 懶,摘自msdn
    在這裡插入圖片描述
  1. Capture 子句(在 C++ 規範中也稱為 lambda 引導。)
  2. 引數列表(可選)。 (也稱為 lambda 宣告符)
  3. 可變規範(可選)。
  4. 異常規範(可選)。
  5. 尾隨返回型別(可選)。
  6. “lambda 體”
  • lambda表示式又被稱作lambda函式,匿名函式。當一個函式,你覺得不需要第二次用到它,你就可以把它寫成lambda函式,因為你沒必要給他起一個名字,只要能實現功能就行。

lambda函式一些常規用法

  • 1.宣告 Lambda 表示式
    • 由於 lambda 表示式已型別化,所以你可以將其指派給 auto 變數或 function 物件,如下所示:
    #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;  
    }  
    
  • Visual C++ 編譯器將在宣告而非呼叫 lambda 表示式時,將表示式繫結到捕獲的變數。 以下示例顯示一個通過值捕獲區域性變數 i 並通過引用捕獲區域性變數 j 的 lambda 表示式。 由於 lambda 表示式通過值捕獲 i,因此在程式後面部分中重新指派 i 不影響該表示式的結果。 但是,由於 lambda 表示式通過引用捕獲 j,因此重新指派 j 會影響該表示式的結果。
    // 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;  //output:47
    }  
    
  • 2.呼叫 Lambda 表示式
    • 你可以立即呼叫 lambda 表示式,如下面的程式碼片段所示。 第二個程式碼片段演示如何將 lambda 作為引數傳遞給標準模板庫 (STL) 演算法,例如 find_if。
    #include <iostream>  
    
    int main()  
    {  
       using namespace std;  
       int n = [] (int x, int y) { return x + y; }(5, 4);  
       cout << n << endl;  //output:9
    }  
    
    • 以下示例將 lambda 表示式作為引數傳遞給 find_if 函式。 如果 lambda 表示式的引數是偶數,則返回 true。其實sort函式也可以這麼用,可以用lambda函式定義比較函式cmp。
    #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;  
        }  
    } 
    
  • 3.巢狀 Lambda 表示式
    • 你可以將 lambda 表示式巢狀在另一箇中,如下例所示。 內部 lambda 表示式將其引數與 2 相乘並返回結果。 外部 lambda 表示式通過其引數呼叫內部 lambda 表示式並在結果上加 3。
    #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;  
    }  
    
  • 4.在函式中使用 Lambda 表示式
    • 你可以在函式的主體中使用 lambda 表示式。 lambda 表示式可以訪問該封閉函式可訪問的任何函式或資料成員。 你可以顯式或隱式捕獲 this 指標,以提供對封閉類的函式和資料成員的訪問路徑。
    	void ApplyScale(const vector<int>& v) const  
    {  
       for_each(v.begin(), v.end(),   
          [this](int n) { cout << n * _scale << endl; });  //可以訪問類變數_scale 
    } 
    
    	void ApplyScale(const vector<int>& v) const  
    {  
       for_each(v.begin(), v.end(),   
          [=](int n) { cout << n * _scale << endl; });  
    }  
    
    

說明

*本文大多摘自msdn的文件,再加上自己的一下理解,把自認為經常能用上的整理了出來。