C++11系列学习之二-----lambda表达式
lambda表達(dá)式的語法如下所示:
[capture_block](parameters) exceptions_specification -> return_type {body}
[捕捉塊](參數(shù)) 異常 -> 返回值類型 {主體}
或者更直白地看如下:
??這里假設(shè)我們定義了一個(gè)如上圖的lambda表達(dá)式。現(xiàn)在來介紹途中標(biāo)有編號(hào)的各個(gè)部分是什么意思。
1. Lambda表達(dá)式的引入標(biāo)志,在‘[]’里面可以填入‘=’或‘&’表示該lambda表達(dá)式“捕獲”(lambda表達(dá)式在一定的scope可以訪問的數(shù)據(jù))的數(shù)據(jù)時(shí)以什么方式捕獲的,‘&’表示一引用的方式;‘=’表明以值傳遞的方式捕獲,除非專門指出。
2. Lambda表達(dá)式的參數(shù)列表
3. Mutable 標(biāo)識(shí)
4. 異常標(biāo)識(shí)
5. 返回值類型
6.“函數(shù)”體,也就是lambda表達(dá)式需要進(jìn)行的實(shí)際操作
下面的例子將逐步演示如何使用lambda表達(dá)式:
范例一:無參數(shù)的lambda表達(dá)式
[]{std::cout<<"Hello from Lambda!"<<std::endl;}();or
[](){std::cout << "Hello from Lambda!" << std::endl; }();輸出如下所示:
Hello from Lambda在控制臺(tái)輸出Hello from Lambda,尾部的括號(hào)使該表達(dá)式可立即執(zhí)行。
范例二:帶參數(shù)的lambda表達(dá)式
輸出如下所示:
Hello from second Lambda該lambda表達(dá)式接受一個(gè)string參數(shù)并返回一個(gè)string,結(jié)果保存在變量result中,尾部的括號(hào)使得該表達(dá)式立即執(zhí)行。
范例三:像平常的調(diào)用函數(shù)一樣使用lamdba表達(dá)式
auto f = [](std::string str)->string{return "hello from " + str; };auto f2 = [](std::string str) {return "hello from " + str; };cout << f2("third lambda") << endl;輸出如下所示:
? ? ?hello from third lambda
此處保存指向lambda表達(dá)式的指針,并且通過函數(shù)指針執(zhí)行該表達(dá)式。范例四:(STL與lambda)
#include <iostream> #include <algorithm> #include <vector>auto main(int argc, char** argv) -> int { std::vector<int> vec={1, 2, 3, 4, 5, 6, 7, 8, 9}; int value=3; int cnt=std::count_if(vec.cbegin(), vec.cend(), [=](int i){return i>value;}); std::cout<<"Found "<<cnt<<" values > "<<value<<std::endl;return 0; }
輸出如下所示:
Found 6 values > 3
通過count_if算法計(jì)算vector中滿足特定條件的元素個(gè)數(shù),lambda表達(dá)式的形式給出了條件,注意表達(dá)式中的=,等號(hào)表示通過值捕捉所在作用域的變量,這個(gè)例子中捕捉的是value的值。前面的例子[]為空,即捕捉塊為空,那么在lambda表達(dá)式的主體body內(nèi)就無法訪問變量了。以下是關(guān)于捕捉塊的詳細(xì)介紹:
[=] ? 通過值捕捉所有變量[&] ?通過引用捕捉所有變量
[value] 通過值捕捉value,不捕捉其它變量
[&value] 通過引用捕捉value,不捕捉其它變量
[=, &value] 默認(rèn)通過值捕捉,變量value例外,通過引用捕捉
[&, value] 默認(rèn)通過引用捕捉,變量value例外,通過值捕捉
范例五:(STL與lambda結(jié)合)
#include <iostream> #include <algorithm> #include <vector>auto main(int argc, char** argv) -> int { std::vector<int> vec2 = { 11, 22, 33, 44 }; int index = 0; for_each(vec2.begin(), vec2.end(),?[index](int i){std::cout << "Value " << (index++)?<< ": " << i << std::endl; }); return 0; }
注意:這里必須使用[&index],而不能使用[index],原因在于index++;否則會(huì)出現(xiàn)
錯(cuò)誤提示:不能在非可變 lambda 中修改按值捕獲
通過for_each算法可以對(duì)給定范圍中的所有元素執(zhí)行特定操作,調(diào)用lambda表達(dá)式,并將這個(gè)值作為參數(shù)傳遞給lambda表達(dá)式。
范例六:(多個(gè)參數(shù))
int n = [](int x, int y) { return x + y; }(5, 4);cout << n << endl;從以上示例來看,
1.如果我們想要提示返回的類型,就要加上->return_type {},否則,直接使用{}即可。
2.C++ 11的lamdba表達(dá)式來源于其它語言,像Python,也有l(wèi)amdba表達(dá)式。如:lambda x: x * x
范例程序差不多了,在C++11中,官方似乎一直鼓勵(lì)大家用lambda表達(dá)式,而不是函數(shù)對(duì)象,lambda表達(dá)式更易于使用和理解。
總結(jié)
以上是生活随笔為你收集整理的C++11系列学习之二-----lambda表达式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 思科防火墙命令介绍
- 下一篇: C++11系列学习之三----array