1. 關(guān)于Lambda表達(dá)式
A lambda function is a function that you can write inline in your source code (usually to pass in to another function, similar to the idea of a functor or function pointer). With lambda, creating quick functions has become much easier, and this means that not only can you start using lambda when you'd previously have needed to write a separate named function, but you can start writing more code that relies on the ability to create quick-and-easy functions.
由上面可以知道,如果要?jiǎng)?chuàng)建快速簡(jiǎn)便功能的,可以盡可能使用Lambda表達(dá)式,因?yàn)樗喈?dāng)于在你的源碼中內(nèi)聯(lián),可以提高效率。
2. 聲明Lambda表達(dá)式
2.1 Lambda表達(dá)式的完整聲明
[capture list] (params list) mutable exception-> return type { function body }
各項(xiàng)的具體含義
- capture list:捕獲外部變量列表
- params list:形參列表
- mutable:是否可以修改捕獲的變量
- exception:異常設(shè)定
- type:返回類型
- {}:返回體
2.2 如何捕獲外部變量
Lambda表達(dá)式的實(shí)現(xiàn)是通過創(chuàng)建一個(gè)"small class”,這個(gè)類重載了(),所以它的運(yùn)行就像一個(gè)函數(shù)。
一個(gè)Lambda函數(shù)就是一個(gè)類的實(shí)例,當(dāng)構(gòu)造類時(shí),周圍環(huán)境中的任何變量都被傳遞到lambda函數(shù)類的構(gòu)造函數(shù)中,并保存為成員變量。
2.2.1 有如下幾種方式進(jìn)行捕獲
[] 不捕獲任何變量
[&] 捕獲任何變量,并作為引用在函數(shù)體使用
[=] 捕獲任何變量,并拷貝一份在函數(shù)體使用
[=, &foo] 截取外部作用域中所有變量,并拷貝一份在函數(shù)體中使用,但是對(duì)foo變量使用引用
[this] 截取當(dāng)前類中的this指針。如果已經(jīng)使用了&或者=就默認(rèn)添加此選項(xiàng)
[x, &y] x 按值捕獲, y 按引用捕獲.
2.2.2 如何使用捕獲
string name;
cin>> name;
return global_address_book.findMatchingAddresses(
// notice that the lambda function uses the the variable 'name'
[&] (const string& addr) { return name.find( addr ) != string::npos; }
);
這里通過捕獲可以使用外部變量name
3. 使用Lambda表達(dá)式
std::vector<int> some_list;
int total = 0;
for (int i=0;i<5;++i) some_list.push_back(i);
std::for_each(begin(some_list), end(some_list), [&total](int x)
{
total += x;
});
std::vector<int> some_list;
int total = 0;
int value = 5;
std::for_each(begin(some_list), end(some_list), [&, value, this](int x)
{
total += x * value * this->some_func();
});
此例中total會(huì)存為引用, value則會(huì)存一份值拷貝. 對(duì)this的捕獲比較特殊, 它只能按值捕獲. this只有當(dāng)包含它的最靠近它的函數(shù)不是靜態(tài)成員函數(shù)時(shí)才能被捕獲 如果this被捕獲了,不管是顯式還隱式的,那么它的類的作用域?qū)ambda函數(shù)就是可見的. 訪問this的成員不必使用this->語(yǔ)法,可以直接訪問.