c++0x:Lambda表示式(匿名函式)
阿新 • • 發佈:2019-01-22
Lambda表示式是一種描述函式物件的機制,它的主要應用是描述某些具有簡單行為的函式。
1.由於 lambda 表示式型別化,可以將其分發給 auto 變數或新增到 function 物件,如以下示例所示:
auto func=[](int a,double b){return a+b;};
function<double(int,double)> f=func;
2.lambda表示式的閉包部分
int a=3,b=4; auto func=[a,&b](int a,int b){return a+b;}; b=40; a=40; int c=func(a,b); cout<<c<<endl;//c為43
[a,&b]為閉包部分,a為值傳遞,b為引用傳遞,開始時a為3,b為4,後來a為40,b為40,因為b是引用傳遞所有c=3+40=43.
3.lambda表示式與STL演算法
vector<int> vec={1,3,2,4};
sort(vec.begin(),vec.end(),[](int a,int b){return a>b;});
for(auto val : vec)
{
cout<<val<<endl;
}
結果為4,3,2,1
4.巢狀lambda表示式
5.高階lambda表示式int m = [](int x) { return [](int y) { return y * 2; }(x) + 3; }(5); cout << m << endl;//m為13
auto g = [](int x) -> function<int (int)>
{ return [=](int y) { return x + y; }; };
auto h = [](const function<int (int)>& f, int z)
{ return f(z) + 1; };
auto a = h(g(7), 8);
cout << a << endl;//a為16
其中[=]表示為值傳遞
6.使用模版的lambda表示式
#include <vector> #include <algorithm> #include <iostream> using namespace std; // 把vector容器中每個元素都取負值 template <typename T> void negate_all(vector<T>& v) { for_each(v.begin(), v.end(), [] (T& n) { n = -n; } ); } // 列印每個元素 template <typename T> void print_all(const vector<T>& v) { for_each(v.begin(), v.end(), [] (const T& n) { cout << n << endl; } ); } int main() { vector<int> v; v.push_back(34); v.push_back(-43); v.push_back(56); negate_all(v); print_all(v); }
結果為:
-34 43 -56
為了描述一個lambda,你必須提供:
- 它的捕捉列表:它可以使用的變數列表(除了形參之外),如果存在的話("[&]" 在上面的記錄比較例子中意味著“所有的區域性變數都將按照引用的方式進行傳遞”)。如果不需要捕捉任何變數,則使用 []。
- (可選的)它的所有引數及其型別(例如: (int a, int b) )。
- 組織成一個塊的函式行為(例如:{ return v[a].name < v[b].name; })。
- (可選的)採用了新的字尾返回型別符號的返回型別。但典型情況下,我們僅從return語句中去推斷返回型別,如果沒有返回任何值,則推斷為void。