2017年3月27日 星期一

C++11 lambda 實際用處與實現

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的指標
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;
}
/*==============================================================*/

參考

沒有留言:

張貼留言