c++ lambda表示式常用的情形
阿新 • • 發佈:2018-12-19
lambda表示式介紹
- 懶,摘自msdn
- Capture 子句(在 C++ 規範中也稱為 lambda 引導。)
- 引數列表(可選)。 (也稱為 lambda 宣告符)
- 可變規範(可選)。
- 異常規範(可選)。
- 尾隨返回型別(可選)。
- “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的文件,再加上自己的一下理解,把自認為經常能用上的整理了出來。