溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C++lambda表達(dá)式如何使用

發(fā)布時(shí)間:2022-08-26 11:37:47 來源:億速云 閱讀:144 作者:iii 欄目:開發(fā)技術(shù)

今天小編給大家分享一下C++lambda表達(dá)式如何使用的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

前言

C++98中的一個(gè)例子。

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
struct Goods
{
	string _name;
	float _price;
	int _evaluate;
	Goods(const char* str, double price, int evaluate)
		:_name(str)
		, _price(price)
		, _evaluate(evaluate)
	{}
};
struct PriceGreater
{
	bool operator()(const Goods& g1, const Goods& g2)
	{
		return g1._price < g2._price;
	}
};
struct PriceLess
{
	bool operator()(const Goods& g1, const Goods& g2)
	{
		return g1._price > g2._price;
	}
};
int main(void)
{
	vector<Goods> v{ {"蘋果", 3.15, 5}, {"香蕉", 4.2, 3}, {"西瓜", 2.8, 4} };
	sort(v.begin(), v.end(), PriceLess()); //按價(jià)格的降序比較
	sort(v.begin(), v.end(), PriceGreater()); //按價(jià)格的升序比較
	return 0;
}

如果待排序的元素是自定義類型,使用sort算法排序時(shí),需要用戶去定義仿函數(shù)類。如果每次比較邏輯不同,就需要實(shí)現(xiàn)不同仿函數(shù)類,這是極其不方便的。所以c++11語法增加了Lambda表達(dá)式。

lambda表達(dá)式格式

lambda表達(dá)式的格式

[捕捉列表](參數(shù)列表)mutable->返回值類型{ 語句部分 };

其中參數(shù)列表、返回值類型是可選的,捕捉列表、函數(shù)體可以為空。

先來看一個(gè)較為簡(jiǎn)單的lamda表達(dá)式

int main(void)
{
	auto add = [](int a, int b)->int {return a + b; };
	cout << add(1, 2) << endl;
	return 0;
}

mutable可以省略,暫時(shí)不考慮。

  • 捕捉列表,捕捉列表的[]是千萬不能省略的,編譯器會(huì)根據(jù)[]判斷該表達(dá)式是否為lambda表達(dá)式,捕捉列表能夠捕捉上下文的變量提供給lambda表達(dá)式使用。

  • 參數(shù)列表,就和普通的函數(shù)傳參是一樣的,如果不需要參數(shù),那么可以連同()一起省略

  • mutable:默認(rèn)情況下,lambda表達(dá)式參數(shù)列表和捕捉列表被修飾成const屬性,而mutable的作用就是取消它的const屬性。如果使用了mutable參數(shù)一定不能省略,如果參數(shù)為空,那么需要保留()。

  • ->返回值類型。返回值類型明確或沒有返回值的情況下,該部分可省略,編譯器會(huì)對(duì)返回值類型進(jìn)行推導(dǎo)。

  • 語句部分。和不同函數(shù)的函數(shù)體內(nèi)語句部分是一樣的含義,函數(shù)體內(nèi)不僅可以使用它的參數(shù),還可以使用所有捕獲到的變量。

所以最簡(jiǎn)單的lambda表達(dá)式應(yīng)該是[]{}

lambda表達(dá)式又被稱為匿名函數(shù),無法被直接調(diào)用,它的底層其實(shí)也是仿函數(shù)類。需要借助auto將表達(dá)式賦值給一個(gè)變量。

一些語法

lambda表達(dá)式的捕捉列表不能捕捉全局變量/靜態(tài)變量

//lambda表達(dá)式的捕捉列表不能捕捉全局變量 / 靜態(tài)變量
int c = 0, d = 0;
auto func1 = [c, d]() {};
int main(void)
{
	static int a = 0;
	static int b = 0;
	auto func1 = [a, b]() {};
	return 0;
}

如果想要改變參數(shù)/捕捉列表,那么就需要加mutable取消const 屬性

//交換兩個(gè)變量的值,方式一:
	int a = 1, b = 2;
	auto swap1 = [](int& x, int& y)mutable {int tmp = x; x = y; y = tmp; };
	swap1(a, b);

捕捉列表描述了上下文中那些數(shù)據(jù)可以被lambda使用,以及使用的方式傳值還是傳引用。

[var]:表示值傳遞方式捕捉變量var

[=]:表示值傳遞方式捕獲所有父作用域中的變量(包括this)

[&var]:表示引用傳遞捕捉變量var

[&]:表示引用傳遞捕捉所有父作用域中的變量(包括this)

[this]:表示值傳遞方式捕捉當(dāng)前的this指

默認(rèn)情況下,使用值傳遞的方式,捕捉到的變量被修飾成const屬性;引用傳遞方式?jīng)]有被修飾。

函數(shù)體內(nèi)使用捕捉到變量,實(shí)際上是捕捉變量的一份拷貝,所以需要對(duì)捕捉變量進(jìn)行修改時(shí),不能使用值傳遞的方式。

//交換兩個(gè)變量的值,方式二:
	auto swap3 = [&c, &d](){int tmp = c; c = d; d = tmp; };
	swap3();

【捕捉列表注意】

同一個(gè)變量不能被同一種傳遞方式多次捕捉。捕捉的范圍:父作用域中所有的非靜態(tài)局部變量。

C++lambda表達(dá)式如何使用

走進(jìn)底層

調(diào)用lambda表達(dá)式的時(shí)候,先把它賦值給auto類型的對(duì)象,然后再使用()調(diào)用。

auto的作用是自動(dòng)推導(dǎo)右邊表達(dá)式的類型,那么lambda表達(dá)式的類型是什么?

C++lambda表達(dá)式如何使用

add是一個(gè)類對(duì)象,類名為<lambda_+uuid>,點(diǎn)擊此處了解uuid。

增加一個(gè)lambda表達(dá)式的調(diào)用
add(1, 2);

轉(zhuǎn)到反匯編,發(fā)現(xiàn)它的類里重載了(),調(diào)用lambda表達(dá)式的底層是去調(diào)用類成員方法operator()。

C++lambda表達(dá)式如何使用

可見lambda表達(dá)式的底層就是仿函數(shù)類,所以它的調(diào)用方法也和仿函數(shù)是一樣的。

不同的lambda表達(dá)式生成的類,是不同的類。一個(gè)lambda表達(dá)式再寫一份,生成的類也是不同的,可以認(rèn)為一個(gè)lambda表達(dá)式語句生成一個(gè)自己唯一的類。

	//lambda表達(dá)式格式
	auto add = [](int a, int b)->int {return a + b; };
	add(1, 2);
	auto add2 = [](int a, int b)->int {return a + b; };
	add2(1, 2);

C++lambda表達(dá)式如何使用

因此要注意,lambda表達(dá)式之間不能相互賦值。

以上就是“C++lambda表達(dá)式如何使用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI