“Lambda 表達式”(lambda expression)是一個匿名函數,`Lambda`表達式基于數學中的λ演算得名,直接對應于其中的lambda抽象(lambda abstraction),是一個匿名函數,即沒有函數名的函數。
我第一次接觸`Lambda`表達式是在C#中,后來才知道C++11引入了`Lambda`表達式。
SO C++ 11 標準的一大亮點是引入`Lambda`表達式。基本語法如下:?
**[capture list] (parameter list) ->return type { function body }**
[] // 沒有定義任何變數。使用未定義變數會導致錯誤。?
[x, &y] // x 以傳值方式傳入(預設),y 以傳參考方式傳入。?
[&] // 任何被使用到的外部變數皆隱式地以參考方式加以引用。?
[=] // 任何被使用到的外部變數皆隱式地以傳值方式加以引用。?
[&, x] // x 顯示地以傳值方式加以引用。其餘變數以參考方式加以引用。?
[=, &z] // z 顯示地以參考方式加以引用。其餘變數以傳值方式加以引用。
~~~
class CTest
{
public:
CTest() : m_nData(20) { NULL; }
void TestLambda()
{
vector<int> vctTemp;
vctTemp.push_back(1);
vctTemp.push_back(2);
// 無函數對象參數,輸出:1 2
{
for_each(vctTemp.begin(), vctTemp.end(), [](int v){ cout << v << endl; });
}
// 以值方式傳遞作用域內所有可見的局部變量(包括this),輸出:11 12
{
int a = 10;
for_each(vctTemp.begin(), vctTemp.end(), [=](int v){ cout << v+a << endl; });
}
// 以引用方式傳遞作用域內所有可見的局部變量(包括this),輸出:11 13 12
{
int a = 10;
for_each(vctTemp.begin(), vctTemp.end(), [&](int v)mutable{ cout << v+a << endl; a++; });
cout << a << endl;
}
// 以值方式傳遞局部變量a,輸出:11 13 10
{
int a = 10;
for_each(vctTemp.begin(), vctTemp.end(), [a](int v)mutable{ cout << v+a << endl; a++; });
cout << a << endl;
}
// 以引用方式傳遞局部變量a,輸出:11 13 12
{
int a = 10;
for_each(vctTemp.begin(), vctTemp.end(), [&a](int v){ cout << v+a << endl; a++; });
cout << a << endl;
}
// 傳遞this,輸出:21 22
{
for_each(vctTemp.begin(), vctTemp.end(), [this](int v){ cout << v+m_nData << endl; });
}
// 除b按引用傳遞外,其他均按值傳遞,輸出:11 12 17
{
int a = 10;
int b = 15;
for_each(vctTemp.begin(), vctTemp.end(), [=, &b](int v){ cout << v+a << endl; b++; });
cout << b << endl;
}
// 操作符重載函數參數按引用傳遞,輸出:2 3
{
for_each(vctTemp.begin(), vctTemp.end(), [](int &v){ v++; });
for_each(vctTemp.begin(), vctTemp.end(), [](int v){ cout << v << endl; });
}
// 空的Lambda表達式
{
[](){}(); []{}();
}
}
private: int m_nData;
};
~~~
其中除了“[ ]”(其中捕獲列表可以為空)和“復合語句”(相當于具名函數定義的函數體),其它都是可選的。
C++中,一個`lambda`表達式表示一個可調用的代碼單元。我們可以將其理解為一個未命名的內聯函數。它與普通函數不同的是,`lambda`必須使用尾置返回來指定返回類型。
你可能會問,除了那些表達式愛好者,誰會用`lambda`表達式呢??
1、距離?
程序員認為,讓定義位于使用的地方附近很有用,因此這樣無需翻閱多頁的源代碼。從這個角度看,`Lambda`表達式是理想的選擇,因為定義和使用是在同一個地方。?
2、簡潔?
函數符代碼比函數和`Lambda`表達式更加繁瑣,函數和`Lambda`表達式的簡潔程度相當。但是不同于函數的是,`Lambda`可以定義于函數內部。?
3、`lambda`可訪問作用域內的任何動態變量。
- 前言
- 吐血整理C++11新特性
- C++11新特性之std::function
- c++11特性之正則表達式
- c++11特性之Lambda表達式
- c++11特性之override和final關鍵字
- c++11特性之std::thread--初識
- c++11特性之std::thread--初識二
- c++11特性之initializer_list
- c++11特性之std::thread--進階
- c++11特性之std::thread--進階二
- C++11新特性之 CALLBACKS
- C++11新特性之 std::array container
- C++11新特性之 nullptr
- C++11新特性之 rvalue Reference(右值引用)
- C++11新特性之 Move semantics(移動語義)
- C++11新特性之 default and delete specifiers
- C++11新特性之 Static assertions 和constructor delegation
- 開始使用C++11的幾個理由
- C++11新特性之 std::future and std::async