1. 程式人生 > >c++0x:Lambda表示式(匿名函式)

c++0x:Lambda表示式(匿名函式)

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表示式

int m = [](int x) 
      { return [](int y) { return y * 2; }(x) + 3; }(5);
 cout << m << endl;//m為13
5.高階lambda表示式
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。