最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++中的lambda表達(dá)式簡(jiǎn)單介紹

 更新時(shí)間:2025年09月08日 16:59:14   作者:落羽的落羽  
文章介紹了C++中l(wèi)ambda表達(dá)式的概念,作為匿名函數(shù)對(duì)象,其類型由編譯器自動(dòng)生成,語(yǔ)法包含捕捉列表、參數(shù)和返回值,支持值/引用捕捉,簡(jiǎn)化可調(diào)用對(duì)象定義,提升代碼簡(jiǎn)潔性,感興趣的朋友跟隨小編一起看看吧

一、 什么是lambda表達(dá)式

C++中有“可調(diào)用對(duì)象”的概念,主要包括函數(shù)指針、仿函數(shù)、lambda表達(dá)式。lambda表達(dá)式本質(zhì)是一個(gè)匿名函數(shù)對(duì)象,跟普通函數(shù)不同的是,他可以定義在函數(shù)內(nèi)部。

lambda表達(dá)式在語(yǔ)法使用層面上“沒(méi)有類型”,簡(jiǎn)單來(lái)說(shuō):lambda表達(dá)式的類型是編譯器即時(shí)生成的、唯一的、匿名的,程序員無(wú)法在代碼中直接寫(xiě)出它的類型名稱。lambda表達(dá)式使用時(shí)本質(zhì)是被轉(zhuǎn)換成一個(gè)仿函數(shù)再使用的,每個(gè)lambda表達(dá)式都會(huì)被編譯器轉(zhuǎn)換成一個(gè)獨(dú)一無(wú)二的、匿名的類(仿函數(shù))。即使兩個(gè)lambda看起來(lái)完全一樣,編譯器也會(huì)為它們生成兩個(gè)不同的類。所以,我們一般都是用auto或者模板參數(shù)定義的對(duì)象去接收l(shuí)ambda對(duì)象

二、 表達(dá)式語(yǔ)法

lambda表達(dá)式的語(yǔ)法格式是:[capture-list](parameters)->return-type {function body}

  • (parameters):參數(shù)列表。與普通的函數(shù)參數(shù)列表功能類似,如果不需要傳參,則可以連同()一起省略。
  • ->return-type:return type是lambda函數(shù)的返回值類型。如果沒(méi)有返回值,那么->return type這部分就可以省略,或者返回值類型明確的情況下,能由編譯器自動(dòng)推導(dǎo)返回類型出來(lái),也能省略這部分。
  • {function body}:函數(shù)體。函數(shù)體的實(shí)現(xiàn)與普通函數(shù)完全一樣,函數(shù)體內(nèi)除了能使用參數(shù)列表外,還可以使用捕捉列表內(nèi)的變量。函數(shù)體為空也必須寫(xiě){}。
  • [capture-list]:捕捉列表。該列表寫(xiě)在lambda表達(dá)式的開(kāi)始位置,編譯器根據(jù)[]來(lái)判斷接下來(lái)的代碼是否為lambda函數(shù)。捕捉列表能夠捕捉上下文的變量,以供lambda函數(shù)內(nèi)部使用,捕捉列表可以傳值或傳引用,捕捉列表就算為空也必須寫(xiě)[]。

舉幾個(gè)栗子:

auto add = [](int x, int y){ return x + y; };

auto func = []
	{
		cout << "hello world" << endl;
	};

auto swap = [](int& a, int& b)
	{
		int tmp = a;
		a = b;
		b = tmp;
	};

非常好理解吧!

關(guān)于捕捉列表,還有一些使用的細(xì)節(jié):

lambda表達(dá)式中默認(rèn)只能使用參數(shù)列表中的變量或lambda內(nèi)定義的,如果想使用外層作用域中的變量就需要進(jìn)行捕捉。

  • 第一種方式是顯式捕捉,在捕捉列表中可以顯式傳值捕捉和傳引用捕捉,捕捉的多個(gè)變量用逗號(hào)分隔,比如[x, y, &z]表示x和y進(jìn)行傳值捕捉,lambda內(nèi)部改變x和y不會(huì)改變?cè)兞?,而z是傳引用捕捉,對(duì)z的改變會(huì)改變?cè)兞俊?/li>
  • 第二種捕捉方式是隱式捕捉,我們?cè)赱 ]中寫(xiě)一個(gè) = 表示隱式值捕捉,寫(xiě)一個(gè) & 表示隱式引用捕捉。這樣我們的lambda的表達(dá)式中使用了哪些外部變量,編譯器就會(huì)自動(dòng)捕捉那些變量。
  • 第三種捕捉列表是混合捕獲,可以組合使用隱式捕獲和顯式捕獲,實(shí)現(xiàn)更精細(xì)的控制。[=, &x] 表示x進(jìn)行引用捕捉,其余變量都為值捕捉;[&, x, y] 表示x和y進(jìn)行值捕捉,其余變量進(jìn)行引用捕捉。使用混合捕捉時(shí),第一個(gè)元素必須是=或&,第一個(gè)是=時(shí),后面的捕捉變量必須是引用捕捉;第一個(gè)是&時(shí),后面的捕捉變量必須是值捕捉。

lambda表達(dá)式中如果在局部域時(shí),可以捕捉到它之前定義的變量,不能捕捉靜態(tài)局部變量和全局變量,因?yàn)檫@兩種變量本來(lái)就不需要捕捉也能在內(nèi)部直接使用,lambda表達(dá)式內(nèi)部可以直接使用。lambda表達(dá)式如果定義在全局位置,捕捉列表必須為空。

默認(rèn)情況下,lambda捕捉列表是const屬性的,也就是說(shuō)傳值捕捉來(lái)的對(duì)象不能被修改,在參數(shù)列表后加上修飾符mutable就可以取消其常性,但是修改還是改變的形參對(duì)象,不會(huì)影響實(shí)參。使用該修飾符后參數(shù)列表不能省略。

int x = 0;
// 捕捉列表必須為空,因?yàn)槿肿兞坎?捕捉就可以?,沒(méi)有可被捕捉的變量
auto func1 = []()
	{
		x++;
	};
int main()
{
	// 只能?當(dāng)前l(fā)ambda局部域和捕捉的對(duì)象和全局對(duì)象
	int a = 0, b = 1, c = 2, d = 3;
	auto func1 = [a, &b]
		{
			// 值捕捉的變量不能修改,引?捕捉的變量可以修改
			//a++;
			b++;
			int ret = a + b;
			return ret;
		};
	cout << func1() << endl;
	// 隱式值捕捉
	// ?了哪些變量就捕捉哪些變量
	auto func2 = [=]
		{
			int ret = a + b + c;
			return ret;
		};
	cout << func2() << endl;
	// 隱式引?捕捉
	// ?了哪些變量就捕捉哪些變量
	auto func3 = [&]
		{
			a++;
			c++;
			d++;
		};
	func3();
	cout << a << " " << b << " " << c << " " << d << endl;
	// 混合捕捉1
	auto func4 = [&, a, b]
		{
			//a++;
			//b++;
			c++;
			d++;
			return a + b + c + d;
		};
	func4();
	cout << a << " " << b << " " << c << " " << d << endl;
	// 混合捕捉1
	auto func5 = [=, &a, &b]
		{
			a++;
			b++;
			/*c++;
			d++;*/
			return a + b + c + d;
		};
		func5();
		cout << a << " " << b << " " << c << " " << d << endl;
	// 局部的靜態(tài)和全局變量不能捕捉,也不需要捕捉
	static int m = 0;
	auto func6 = []
		{
			int ret = x + m;
			return ret;
		};
	// 傳值捕捉本質(zhì)是?種拷?,并且被const修飾了
	// mutable相當(dāng)于去掉const屬性,可以修改了
	// 但是修改了不會(huì)影響外?被捕捉的值,因?yàn)槭?種拷?
	auto func7 = [=]()mutable
		{
			a++;
			b++;
			c++;
			d++;
			return a + b + c + d;
		};
	cout << func7() << endl;
	cout << a << " " << b << " " << c << " " << d << endl;
	return 0;
}

三、lambda的應(yīng)用

學(xué)習(xí)lambda表達(dá)式之前,我們使用的可調(diào)用對(duì)象只有函數(shù)指針和仿函數(shù),它們的定義都相對(duì)麻煩,使用lambda表達(dá)式去定義可調(diào)用對(duì)象,就十分簡(jiǎn)單方便了。

vector<pair<int, int>> v = { {1,2}, {3,4}, {8,3}, {5,1} };
//遇到這樣的場(chǎng)景,假如我們想要用多種排序規(guī)則進(jìn)行排序,以前是需要寫(xiě)不同的仿函數(shù)傳給sort
/*struct Compare_first
{
	bool operator()(const pair<int, int>& p1, const pair<int, int>& p2)
	{
		return p1.first < p2.first;
	}
}; 
struct Compare_second
{
	bool operator()(const pair<int, int>& p1, const pair<int, int>& p2)
	{
		return p1.second < p2.second;
	}
};
sort(v.begin(), v.end(), Compare_first());
sort(v.begin(), v.end(), Compare_second());*/
//有了lambda表達(dá)式后,就方便許多了
sort(v.begin(), v.end(), [](const pair<int, int>& p1, const pair<int, int>& p2) {return p1.first < p2.first; });
for (auto pa : v)
{
	cout << pa.first << ":" << pa.second << " ";
}
cout << endl;
sort(v.begin(), v.end(), [](const pair<int, int>& p1, const pair<int, int>& p2) {return p1.second < p2.second; });
for (auto pa : v)
{
	cout << pa.first << ":" << pa.second << " ";
}
cout << endl;

到此這篇關(guān)于C++簡(jiǎn)單介紹lambda表達(dá)式的文章就介紹到這了,更多相關(guān)C++ lambda表達(dá)式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++動(dòng)態(tài)加載so/dll庫(kù)的實(shí)現(xiàn)

    C++動(dòng)態(tài)加載so/dll庫(kù)的實(shí)現(xiàn)

    本文主要介紹了C++動(dòng)態(tài)加載so/dll庫(kù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 淺談C++中的引用和指針

    淺談C++中的引用和指針

    這篇文章主要介紹了淺談C++中的引用和指針,C++允許為已定義的變量再起一個(gè)新的別名,稱為變量的引用名,引用名看起來(lái)像是一個(gè)變量名,但它是一種特殊變量,稱為引用變量,或簡(jiǎn)稱為引用,需要的朋友可以參考下
    2023-08-08
  • C++17新特性編譯期 if 語(yǔ)句 (if constexpr)詳解

    C++17新特性編譯期 if 語(yǔ)句 (if constexpr)詳解

    本文介紹了C++17引入的ifconstexpr關(guān)鍵字,通過(guò)解析其工作原理、底層機(jī)制和應(yīng)用場(chǎng)景,說(shuō)明了其在模板元編程中的優(yōu)勢(shì),本文將詳細(xì)、嚴(yán)謹(jǐn)?shù)仄饰銎涔ぷ髟砑昂诵膽?yīng)用場(chǎng)景,感興趣的朋友一起看看吧
    2026-04-04
  • C++將字符串格式化的幾種方式總結(jié)

    C++將字符串格式化的幾種方式總結(jié)

    這篇文章主要介紹了C++將字符串格式化的幾種方式總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • C語(yǔ)言實(shí)現(xiàn)圖片放大縮小

    C語(yǔ)言實(shí)現(xiàn)圖片放大縮小

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)圖片放大縮小,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C語(yǔ)言線性表的順序表示與實(shí)現(xiàn)實(shí)例詳解

    C語(yǔ)言線性表的順序表示與實(shí)現(xiàn)實(shí)例詳解

    這篇文章主要介紹了C語(yǔ)言線性表的順序表示與實(shí)現(xiàn)實(shí)例詳解,對(duì)于學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法的朋友很有參考借鑒價(jià)值,需要的朋友可以參考下
    2014-07-07
  • C++解決業(yè)務(wù)辦理時(shí)間問(wèn)題示例解析

    C++解決業(yè)務(wù)辦理時(shí)間問(wèn)題示例解析

    這篇文章主要為大家介紹了C++解決業(yè)務(wù)辦理時(shí)間問(wèn)題示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • C語(yǔ)言保留字與標(biāo)識(shí)符規(guī)則的詳細(xì)指南

    C語(yǔ)言保留字與標(biāo)識(shí)符規(guī)則的詳細(xì)指南

    C語(yǔ)言作為一種高效、靈活的編程語(yǔ)言,其核心構(gòu)建塊——保留字和標(biāo)識(shí)符——構(gòu)成了代碼的骨架,本文將深入探討這些概念,輔以代碼示例、圖表和外部資源鏈接,助你全面掌握,需要的朋友可以參考下
    2026-03-03
  • C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之堆排序的優(yōu)化算法

    C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之堆排序的優(yōu)化算法

    堆排序Heap?Sort就是利用堆進(jìn)行排序的方法,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之堆排序的優(yōu)化算法的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • C++實(shí)現(xiàn)LeetCode(191.位1的個(gè)數(shù))

    C++實(shí)現(xiàn)LeetCode(191.位1的個(gè)數(shù))

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(191.位1的個(gè)數(shù)),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08

最新評(píng)論

漳平市| 苍溪县| 施甸县| 公安县| 三台县| 武功县| 汾西县| 巫溪县| 新余市| 马山县| 浦县| 孟州市| 嘉鱼县| 三门县| 寻乌县| 扬中市| 漳平市| 白银市| 顺平县| 海原县| 巢湖市| 洛川县| 喜德县| 东阿县| 界首市| 江城| 乌什县| 达州市| 阜南县| 三门峡市| 乐业县| 南雄市| 固镇县| 阿克陶县| 华容县| 丽江市| 吴堡县| 且末县| 彭阳县| 延寿县| 桃江县|