C++學習筆記(十七) - Lambda函數(shù)

參考文獻:C++11新特性:Lambda函數(shù)(匿名函數(shù))
匿名函數(shù)不翩,C++11里面加入了匿名函數(shù)。

1 定義一個基本的Lambda匿名函數(shù)

    #include <iostream>    
    using namespace std;    
    int main()  
    {  
        auto func = [] () { cout << "Hello world"; };  
        func(); // now call the function  
    }  

func就是定義的匿名函數(shù)麻裳,使用auto自動獲取func的類型口蝠,定義好之后,就可以當做常函數(shù)使用了津坑。
[]表示接下來定義lambda函數(shù)妙蔗,中括號中間有可能還會填參數(shù),之后的()填寫的是lambda函數(shù)的參數(shù)列表国瓮,{}中間是函數(shù)體灭必。
正常情況下狞谱,只要函數(shù)體中所有return都是同一個類型的話乃摹,編譯器就會自行判斷函數(shù)的返回類型。也可以顯示地指定lambda函數(shù)的返回類型跟衅。這個叫函數(shù)返回值后置的功能:

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

總的來說孵睬,lambda函數(shù)的形式是:

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

2 Lambda函數(shù)的用處

假設你設計了一個地址簿的類。現(xiàn)在你要提供函數(shù)查詢這個地址簿伶跷,可能根據(jù)姓名查詢掰读,可能根據(jù)地址查詢,還有可能兩者結(jié)合叭莫。要是你為這些情況都寫個函數(shù)蹈集,那么你一定就跪了。所以你應該提供一個接口雇初,能方便地讓用戶自定義自己的查詢方式拢肆。在這里可以使用lambda函數(shù)來實現(xiàn)這個功能。


    #include <string>  
    #include <vector>  
      
    class AddressBook  
    {  
        public:  
        // using a template allows us to ignore the differences between functors, function pointers   
        // and lambda  
        template<typename Func>  
        std::vector<std::string> findMatchingAddresses (Func func)  
        {   
            std::vector<std::string> results;  
            for ( auto itr = _addresses.begin(), end = _addresses.end(); itr != end; ++itr )  
            {  
                // call the function passed into findMatchingAddresses and see if it matches  
                if ( func( *itr ) )  
                {  
                    results.push_back( *itr );  
                }  
            }  
            return results;  
        }  
      
        private:  
        std::vector<std::string> _addresses;  
    };  

從上面代碼可以看到,findMatchingAddressses函數(shù)提供的參數(shù)是Func類型郭怪,這是一個泛型類型支示。在使用過程中應該傳入一個函數(shù),然后分別對地址簿中每一個entry執(zhí)行這個函數(shù)鄙才,如果返回值為真那么表明這個entry符合使用者的篩選要求颂鸿,那么就應該放入結(jié)果當中。那么這個Func類型的參數(shù)如何傳入呢攒庵?

AddressBook global_address_book;  
  
vector<string> findAddressesFromOrgs ()  
{  
    return global_address_book.findMatchingAddresses(   
        // we're declaring a lambda here; the [] signals the start  
        [] (const string& addr) { return addr.find( ".org" ) != string::npos; }   
    );  
}

可以看到嘴纺,我們在調(diào)用函數(shù)的時候直接定義了一個lambda函數(shù)。參數(shù)類型是 :

const string& addr  

返回值是bool類型叙甸。
如果用戶要使用不同的方式查詢的話颖医,只要定義不同的lambda函數(shù)就可以了。

3 Lambda函數(shù)和STL

lambda函數(shù)的引入為STL的使用提供了極大的方便裆蒸。比如下面這個例子熔萧,當你想遍歷一個vector的時候,原來你得這么寫:

vector<int> v;  
v.push_back( 1 );  
v.push_back( 2 );  
//...  
for ( auto itr = v.begin(), end = v.end(); itr != end; itr++ )  
{  
    cout << *itr;  
} 

現(xiàn)在有了lambda函數(shù)你就可以這么寫:

vector<int> v;  
v.push_back( 1 );  
v.push_back( 2 );  
//...  
for_each( v.begin(), v.end(), [] (int val)  
{  
    cout << val;  
} ); 

而且這么寫了之后執(zhí)行效率反而提高了僚祷。因為編譯器有可能使用”循環(huán)展開“來加速執(zhí)行過程

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末佛致,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子辙谜,更是在濱河造成了極大的恐慌俺榆,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件装哆,死亡現(xiàn)場離奇詭異罐脊,居然都是意外死亡,警方通過查閱死者的電腦和手機蜕琴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門萍桌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人凌简,你說我怎么就攤上這事上炎。” “怎么了雏搂?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵藕施,是天一觀的道長。 經(jīng)常有香客問我凸郑,道長裳食,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任芙沥,我火速辦了婚禮诲祸,結(jié)果婚禮上尘盼,老公的妹妹穿的比我還像新娘。我一直安慰自己烦绳,他們只是感情好卿捎,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著径密,像睡著了一般午阵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上享扔,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天底桂,我揣著相機與錄音,去河邊找鬼惧眠。 笑死籽懦,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的氛魁。 我是一名探鬼主播暮顺,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼秀存!你這毒婦竟也來了捶码?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤或链,失蹤者是張志新(化名)和其女友劉穎惫恼,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體澳盐,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡祈纯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了叼耙。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片腕窥。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖旬蟋,靈堂內(nèi)的尸體忽然破棺而出油昂,到底是詐尸還是另有隱情革娄,我是刑警寧澤倾贰,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站拦惋,受9級特大地震影響匆浙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜厕妖,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一首尼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦软能、人聲如沸迎捺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽凳枝。三九已至,卻和暖如春跋核,著一層夾襖步出監(jiān)牢的瞬間岖瑰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工砂代, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蹋订,地道東北人。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓刻伊,卻偏偏與公主長得像露戒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子捶箱,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內(nèi)容