by feng
有了 lambda 的支持之後,寫一些函數式的代碼更加方便了,比如
1 2 3std::vector<int> vec;
std::for_each( vec.begin(), vec.end(),
[](int i){ std::cout <<i << " "; } );
再比如
1 2std::sort( vec.begin(), vec.end(), [](int i, int j)
{ return std::abs(i) < std::abs(j); } );
其中的
1[](int i, int j){return std::abs(i) < std::abs(j);}
就是一個 lambda 對象。這個匿名對象返回的類型是
1decltype(std::abs(j)<std::abs(j))
需要特別說明的是,只有當 lambda 對象中有 return expression 時,返回類型才可以忽略,否則就是 void。因此,這個 lambda 對象完全寫下來是這樣的:
1 2[](int i, int j) -> bool
{ return std::abs(i) < std::abs(j); }
這其中的 [] 稱為 lambda 導引符(lambda-introducer),裡邊可以是空的,也可以有幾個變量名稱:
[] // 未定義任何參數
[x, &y] // x 以值傳入,y 以引用傳入
[&] //所有外部參數皆以引用傳入
[=] // 所有外部參數皆以值傳入
[&, x] // x 以值傳入,其余以引用傳入
[=, &z] // z 以引用傳入,其余以值傳入
下邊是一個使用外部參數的例子
1 2 3 4std::vector<double> arr;
double sum = 0;
std::for_each( arr.begin(), arr.end(),
[&sum](double d){ sum += std::exp(d); } );
其中 sum 以引用傳入,相當於計算
並將結果存入 sum 中。
當然,上邊也可直接抓取所有外部參數的引用做簡化,這在參數很多的時候很有用