程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> c++0x 學習筆記之 lambda

c++0x 學習筆記之 lambda

編輯:C++入門知識

by feng

有了 lambda 的支持之後,寫一些函數式的代碼更加方便了,比如

1 2 3 std::vector<int> vec; std::for_each( vec.begin(), vec.end(),                [](int i){ std::cout <<i << " "; } );

再比如

1 2 std::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 對象。這個匿名對象返回的類型是

1 decltype(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 4 std::vector<double> arr; double sum = 0; std::for_each( arr.begin(), arr.end(),                [&sum](double d){ sum += std::exp(d); } );

其中 sum 以引用傳入,相當於計算

S = sum_{i=1}^{i=N} e^{A_i}

並將結果存入 sum 中。

當然,上邊也可直接抓取所有外部參數的引用做簡化,這在參數很多的時候很有用

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved