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 中。
當然,上邊也可直接抓取所有外部參數的引用做簡化,這在參數很多的時候很有用