C++11 lambda 實際用處與實現
tags: C++ Concept
C++開始才有的新語法,lambda匿名函式,看起來可能與原本的函式差不多,實際上有個很大的用處,用一句話形容
精簡呼叫方法
而且這種精簡是傳統副程式做不到的精簡
示例
如果你有一個函式
int fun(int a, int b){
return a+b;
}
你希望它們做陣列的相加你必須這麼輸入
cout << fun(arr[1], arr[2]) << endl;
可是每次都要打arr實在有點擾人,我就只想對arr不對別人了
auto l = [&](int a, int b){
return fun(arr[a], arr[b]);
};
使用這樣的語意實現副函式無法實現的精簡呼叫方法
cout << l(1, 2) << endl;
你可以省略每次都打arr的麻煩
如果用副函式實現還要輸入arr的指標
如果用副函式實現還要輸入arr的指標
int arr_add(int* p, int a, int b){
return p[a]+p[b];
}
// 使用副程式實現(無法完全精簡還是有個arr)
cout << arr_add(arr, 1, 2) << endl;
優勢
除了可以完全精簡之外,比如說如文中還要導入arr的指標進去,出現在類別的封裝個是惱人,為了這個必須寫一個與資料成員毫無相關的函式。
也可以減少副程式名稱對環境的汙染,也省去了花時間去想函式名字的煩惱,有時候要想個好名稱真的很費時間。
代碼
/*****************************************************************
Name :
Date : 2017/03/27
By : CharlotteHonG
Final: 2017/03/27
*****************************************************************/
#include <iostream>
using namespace std;
int fun(int a, int b){
return a+b;
}
int arr_add(int* p, int a, int b){
return p[a]+p[b];
}
/*==============================================================*/
int main(int argc, char const *argv[]){
int arr[]{1, 2, 3, 4, 5};
// 每次都要打 arr有點擾人
cout << fun(arr[1], arr[2]) << endl;
// lambda
auto l = [&](int a, int b){
return fun(arr[a], arr[b]);
};
// 現在你不用打那麼長了,也不用為了不汙染環境而想函式名字想破腦
cout << l(1, 2) << endl;
// 使用副程式實現(無法完全精簡)
cout << arr_add(arr, 1, 2) << endl;
return 0;
}
/*==============================================================*/