??C++11系列學(xué)習(xí)之Lambda表達(dá)式
前言:
終于在C++11中引入了lambda表達(dá)式,lambda最早來(lái)源于函數(shù)式編程,現(xiàn)代語(yǔ)言慢慢都引入了這個(gè)語(yǔ)法,C++也不甘落后,在新標(biāo)準(zhǔn)中加入了lambda表達(dá)式。
一、為什么要有l(wèi)ambda表達(dá)式?
- 使用方便,就地聲明函數(shù)或函數(shù)對(duì)象,尤其是和bind配合食用更佳
- 簡(jiǎn)潔,可以匿名創(chuàng)建,語(yǔ)法看起來(lái)極其舒適
- 可以實(shí)現(xiàn)功能閉包,使用起來(lái)更加靈活
二、使用語(yǔ)法
lambda的通用語(yǔ)法:[ 捕獲列表] ( 參數(shù)表 ) 函數(shù)選項(xiàng) -> 返回值類(lèi)型 { 函數(shù)體 ;};
捕獲列表
- [] 不捕獲任何變量
- [&] 以引用方式捕獲外部作用域中所有變量
- [=] 以值的方式捕獲外部作用域中的所有變量
- [= , &x] 以值方式捕獲外部作用域變量,但是以引用方式捕獲x變量
- [ x ] 按值方式捕獲 x 變量
- [ this ] 捕獲當(dāng)前類(lèi)的this指針,那么lambda表達(dá)式擁有了和類(lèi)成員函數(shù)同樣的權(quán)限,如果使用了& 或 = 那么默認(rèn)添加了此項(xiàng)
mutable影響lambda表達(dá)式
被mutable 修飾的lambda表達(dá)式就算沒(méi)有參數(shù)也要寫(xiě)明參數(shù)列表,若沒(méi)有加mutable,lambda不能修改這個(gè)變量的值,只能使用。 但是被修飾后的lambda表達(dá)式,會(huì)像函數(shù)傳遞參數(shù)一樣,在內(nèi)部定義一個(gè)變量并拷貝這個(gè)值。
#include <iostream> using namespace std; int main() { size_t t = 9; auto f = [t] () mutable {return ++t; }; cout << f() << endl; //10 cout << f() << endl; //11 cout << "t:" << t << endl; //9 return 0; }
可以把它視為帶有重載括號(hào)運(yùn)算符的仿函數(shù),并且沒(méi)有捕獲任何變量的lambda表達(dá)式可以被轉(zhuǎn)換成一個(gè)普通的函數(shù)指針
//用std::function來(lái)存儲(chǔ)和操作lambda表達(dá)式 std::function<int, int> f1 = [](int a){ return a}; //轉(zhuǎn)換為一個(gè)普通的函數(shù)指針 using fun = int(*){int}; fun f =[](int a){return a;} f(1)
std::bind和lambda表達(dá)式結(jié)合
//eg : 用來(lái)集合中計(jì)算大于5小于10的元素的個(gè)數(shù) auto f = std::(std::logical_and<bool>(), std::bind( std::greater<int>(), _1, 5), std::bind(std::lesss<int>(),_1, 10)); int count = std::count::_if(coll.bengin(), coll.end(),f);
三、std::function 和lambda表達(dá)式選擇
lambda
和std::function
的效果是一樣的,但是更加簡(jiǎn)潔一些,但不能完全代替,因?yàn)橐恍├系膸?kù)不支持lambda表達(dá)式
到此這篇關(guān)于??C++11系列學(xué)習(xí)之Lambda表達(dá)式的文章就介紹到這了,更多相關(guān)??C++11Lambda表達(dá)式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++?Boost?weak_ptr智能指針超詳細(xì)講解
智能指針是一種像指針的C++對(duì)象,但它能夠在對(duì)象不使用的時(shí)候自己銷(xiāo)毀掉。雖然STL提供了auto_ptr,但是由于不能同容器一起使用(不支持拷貝和賦值操作),因此很少有人使用。它是Boost各組件中,應(yīng)用最為廣泛的一個(gè)2022-11-11C語(yǔ)言實(shí)現(xiàn)三子棋實(shí)例代碼
大家好,本篇文章主要講的是C語(yǔ)言實(shí)現(xiàn)三子棋實(shí)例代碼,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2022-01-01C語(yǔ)言用棧實(shí)現(xiàn)十進(jìn)制轉(zhuǎn)換為二進(jìn)制的方法示例
這篇文章主要介紹了C語(yǔ)言用棧實(shí)現(xiàn)十進(jìn)制轉(zhuǎn)換為二進(jìn)制的方法,結(jié)合實(shí)例形式分析了C語(yǔ)言棧的定義及進(jìn)制轉(zhuǎn)換使用技巧,需要的朋友可以參考下2017-06-06C語(yǔ)言如何建立鏈表并實(shí)現(xiàn)增刪查改詳解
這篇文章主要給大家介紹了關(guān)于C語(yǔ)言如何建立鏈表并實(shí)現(xiàn)增刪查改的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C語(yǔ)言具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08深入學(xué)習(xí)C++智能指針之shared_ptr與右值引用的方法
智能指針的核心實(shí)現(xiàn)技術(shù)是引用計(jì)數(shù),每使用它一次,內(nèi)部引用計(jì)數(shù)加1,每析構(gòu)一次內(nèi)部的引用計(jì)數(shù)減1,減為0時(shí),刪除所指向的堆內(nèi)存,今天通過(guò)本文給大家分享C++智能指針之shared_ptr與右值引用的方法,需要的朋友跟隨小編一起看看吧2021-07-07