www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > > 充電吧
[導(dǎo)讀]C++11終于知道要在語(yǔ)言中加入匿名函數(shù)了。匿名函數(shù)在很多時(shí)候可以為編碼提供便利,這在下文會(huì)提到。很多語(yǔ)言中的匿名函數(shù),如C++,都是用Lambda表達(dá)式實(shí)現(xiàn)的。Lambda表達(dá)式又稱為lambda函

C++11終于知道要在語(yǔ)言中加入匿名函數(shù)了。匿名函數(shù)在很多時(shí)候可以為編碼提供便利,這在下文會(huì)提到。很多語(yǔ)言中的匿名函數(shù),如C++,都是用Lambda表達(dá)式實(shí)現(xiàn)的。Lambda表達(dá)式又稱為lambda函數(shù)。我在下文中稱之為L(zhǎng)ambda函數(shù)。

為了明白Lambda函數(shù)的用處,請(qǐng)務(wù)必先搞明白C++中的自動(dòng)類型推斷:http://www.linuxidc.com/Linux/2013-12/93369.htm

基本的Lambda函數(shù)

我們可以這樣定義一個(gè)Lambda函數(shù):

#include

using namespace std;

int main()
{
? ? auto func = [] () { cout << "Hello world"; };
? ? func(); // now call the function
}

其中func就是一個(gè)lambda函數(shù)。我們使用auto來(lái)自動(dòng)獲取func的類型,這個(gè)非常重要。定義好lambda函數(shù)之后,就可以當(dāng)這場(chǎng)函數(shù)來(lái)使用了。

其中 [ ] 表示接下來(lái)開(kāi)始定義lambda函數(shù),中括號(hào)中間有可能還會(huì)填參數(shù),這在后面介紹。之后的()填寫(xiě)的是lambda函數(shù)的參數(shù)列表{}中間就是函數(shù)體了。

正常情況下,只要函數(shù)體中所有return都是同一個(gè)類型的話,編譯器就會(huì)自行判斷函數(shù)的返回類型。也可以顯示地指定lambda函數(shù)的返回類型。這個(gè)需要用到函數(shù)返回值后置的功能,比如這個(gè)例子:

[] () -> int { return 1; }

所以總的來(lái)說(shuō)lambda函數(shù)的形式就是:

[captures] (params) -> ret {Statments;}

Lambda函數(shù)的用處

假設(shè)你設(shè)計(jì)了一個(gè)地址簿的類?,F(xiàn)在你要提供函數(shù)查詢這個(gè)地址簿,可能根據(jù)姓名查詢,可能根據(jù)地址查詢,還有可能兩者結(jié)合。要是你為這些情況都寫(xiě)個(gè)函數(shù),那么你一定就跪了。所以你應(yīng)該提供一個(gè)接口,能方便地讓用戶自定義自己的查詢方式。在這里可以使用lambda函數(shù)來(lái)實(shí)現(xiàn)這個(gè)功能。

#include

class AddressBook
{
? ? public:
? ? // using a template allows us to ignore the differences between functors, function pointers?
? ? // and lambda
? ? template

? ? private:
? ? std::vector

從上面代碼可以看到,findMatchingAddressses函數(shù)提供的參數(shù)是Func類型,這是一個(gè)泛型類型。在使用過(guò)程中應(yīng)該傳入一個(gè)函數(shù),然后分別對(duì)地址簿中每一個(gè)entry執(zhí)行這個(gè)函數(shù),如果返回值為真那么表明這個(gè)entry符合使用者的篩選要求,那么就應(yīng)該放入結(jié)果當(dāng)中。那么這個(gè)Func類型的參數(shù)如何傳入呢?

AddressBook global_address_book;

vector

可以看到,我們?cè)谡{(diào)用函數(shù)的時(shí)候直接定義了一個(gè)lambda函數(shù)。參數(shù)類型是

const string& addr

返回值是bool類型。

如果用戶要使用不同的方式查詢的話,只要定義不同的lambda函數(shù)就可以了。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

c++程序員面試過(guò)程中基本上都會(huì)被問(wèn)到c++11新特性吧,你是怎么回答的呢? 本文基本上涵蓋了c++11的所有新特性,并有詳細(xì)代碼介紹其用法,對(duì)關(guān)鍵知識(shí)點(diǎn)做了深入分析,對(duì)重要的知識(shí)點(diǎn)我單獨(dú)寫(xiě)了相關(guān)文章并附上了相關(guān)鏈接,我...

關(guān)鍵字: c++11

很多人談到c++,說(shuō)它特別難,可能有一部分就是因?yàn)閏++的內(nèi)存管理吧,不像java那樣有虛擬機(jī)動(dòng)態(tài)的管理內(nèi)存,在程序運(yùn)行過(guò)程中可能就會(huì)出現(xiàn)內(nèi)存泄漏,然而這種問(wèn)題其實(shí)都可以通過(guò)c++11引入的智能指針來(lái)解決,相反我還認(rèn)為這...

關(guān)鍵字: c++11

c++11關(guān)于并發(fā)引入了好多好東西,這里按照如下順序介紹: std::thread相關(guān) std::mutex相關(guān) std::lock相關(guān) std::atomic相關(guān) std::call_once相關(guān) volatile相關(guān)...

關(guān)鍵字: 線程 c++11

以前,在lambda表達(dá)式?jīng)]有進(jìn)入標(biāo)準(zhǔn)的時(shí)候,對(duì)容器的遍歷等涉及到使用函數(shù)指針的情況,一般人會(huì)懶得使用std::for_each,或std::transform,也許只是一個(gè)短短的幾句話,卻要單獨(dú)寫(xiě)個(gè)

關(guān)鍵字: c++ c++11

emplace操作是C++11新特性,新引入的的三個(gè)成員emlace_front、empace 和 emplace_back,這些操作構(gòu)造而不是拷貝元素到容器中,這些操作分別對(duì)應(yīng)push_front、

關(guān)鍵字: c++11 emplace

const引用在C++語(yǔ)言中,引用是作為一種高效,安全的傳遞數(shù)據(jù)的方式而存在的。除了一般的引用類型,還可以聲明const引用。我們有以下一個(gè)Image類。class?Image { public: ?

關(guān)鍵字: c++11 const引用 右值引用

讓我們從std::make_unique和std::make_shared之間的比較開(kāi)始講起吧。std::make_shared是C++11的一部分,可惜的是,std::make_unique不是,它

關(guān)鍵字: c++ c++11

為什么需要?jiǎng)e名下面的說(shuō)明只是一個(gè)例子,實(shí)際的使用場(chǎng)景一定不止這些。假設(shè)有一個(gè)二維圖形計(jì)算的程序,定義了一個(gè)point結(jié)構(gòu)體。struct?point{???int?x;???int?y;};在有些系統(tǒng)

關(guān)鍵字: c++11 類型別名

熟悉C++98/03的對(duì)于for循環(huán)就再了解不過(guò)了,如果我們要遍歷一個(gè)數(shù)組,那么在C++98/03中的實(shí)現(xiàn)方式:int?arr[10]?=?{?1,?2,?3,?4,?5,?6,?7,?8,?9,?1

關(guān)鍵字: c++ c++11

C++11的一大亮點(diǎn)就是引入了Lambda表達(dá)式。利用Lambda表達(dá)式,可以方便的定義和創(chuàng)建匿名函數(shù)。對(duì)于C++這門(mén)語(yǔ)言來(lái)說(shuō)來(lái)說(shuō),“Lambda表達(dá)式”或“匿名函數(shù)”這些概念聽(tīng)起來(lái)好像很深?yuàn)W,但很多

關(guān)鍵字: c++11 lambda表達(dá)式 匿名函數(shù)
關(guān)閉