C 中lambda表示式

2021-07-05 01:42:54 字數 3098 閱讀 6346

在介紹lambda表示式之前,我想先介紹以下c++標準庫所支援的傳統謂詞以及傳統謂次的不足,而由此才引入的lambda表示式

謂詞是個可呼叫的表示式,其返回結果是乙個能作為條件的值。謂詞分為一元和二元,一元的可呼叫物件只能有乙個引數,二元只能有倆個引數

我們以一元謂詞舉例:

c++標準庫中的find_if()函式,它的功能是這樣的。該函式接收一對迭代器,表示乙個範圍,它的第三個引數是乙個謂詞,其迭代器範圍內的每乙個元素都會執行這個謂詞操作,它返回第乙個使謂詞非0的元素的迭代器,否則返回尾迭代器

具體例項如下

#include

#include

#include

using

namespace

std;

//謂詞

bool judge(const

int &x)

int main(void)

; auto it = find_if(v.begin(),v.end(),judge);

if(it == v.end())

在如上程式中我通過謂詞judge找到了第乙個大於5的元素,那麼問題來了,如果我要找第乙個大於6的元素呢?我想很多人會說那就在寫乙個judge函式。不得不承認這是一種解此問題的方法,可是如果我的程式需要一直修改所大於數的值呢?顯然只靠上述辦法是不行的。那麼又會有人說給謂詞加個引數,讓它去傳遞所大於數的值不就好了。我對此回答只能說想法是好的,只是find_if函式只支援一元謂詞,你加個引數就成二元謂詞了。我想說到這裡大家感覺沒招了吧,這個時候lambda就該現世了^_^

lambda表示也是一種可呼叫物件,其與函式最大的區別就是它可以定義在函式的內部,它的具體形式如下

[捕獲鍊錶](引數列表)->返回型別
其中捕獲列表是lambda所在函式的區域性變數的列表(可以為空),引數列表和函式體與函式表示意義相同,但是與函式不同的是lambda必須使用尾置返回來指定返回型別

在平時的使用當中我們可以忽略引數列表和返回型別,但至少得包含捕獲列表和函式體

//定義磕掉用物件f

auto f = ;

//我們可以像呼叫普通函式一樣呼叫它

cout

《注意:如果lambda的函式體裡只有乙個return 語句,則預設的返回型別與return 的返回型別一致,否則預設其的返回型別為void

上面介紹了那麼多無非就是想學習一下lambda好用來解我們之前的那個問題,接下來就為大家說明解它的方法

首先我感覺我們上面所遇到的核心問題應該是find_if演算法只支援一元謂詞,意味這只能給其傳遞乙個引數,那麼我們之前所想的方法的另乙個引數得咋麼傳呢?沒錯,由於通過捕獲列表可以獲得呼叫lambda的函式的區域性變數,我們何不就通過捕獲列表來控制此引數呢,廢話不說,直接上**

#include

#include

#include

using

namespace

std;

int main(void)

; int n;

cout

<<"請輸入所要查詢的數要比哪個數大";

cin>>n;

auto it = find_if(v.begin(),v.end(),[n](const

int &x));

if(it == v.end())

可以看的出來利用lambda表示式可以輕鬆解決我們之前的問題^_^

(1)值捕獲

與引數不同,**獲的變數值是在lambda建立時拷貝,而不是呼叫時拷貝,因此隨後對變數進行修改,將不會影響lambda內對應的值

例項

int n = 66;

//捕獲n

auto f = [n](void);

n = 55;

//此時t依然是66

auto t = f();

(2)引用捕獲

我們也可以在捕獲列表中的變數名前加&此種捕獲方式便是引用捕獲。當我們在lambda函式體內使用變數時,其實就是在使用引用所繫結的實體

具體例項如下

int n = 66;

//引用n

auto f = [&n](void);

n = 55;

此時t為66

int t = f();

(3)隱式捕獲

除了顯示的列出我們希望使用的來自所有函式的變數之外,還可以讓編譯器根據lambda體中的**來推斷我們要使用哪些變數。為了指示編譯器推斷捕獲列表,應在捕獲列表中寫乙個&或=。&表示採用引用捕獲,=表示採用值捕獲方式

例項如下

int n1 = 2;

int n2 = 3;

int n3 = 4;

//此lambda表示式表示除了n2為值捕獲外,其他剩餘所有區域性變數都為引用捕獲

auto f = [&,n2](void);

(4)關於捕獲列表完全體例項**

#include

#include

#include

#include

using

namespace

std;

int main(void)

; //改變n1的值

n1 = 1+5;

int t = f1();

cout

<<"t1 = "

<1;

//以引用捕獲n1;

auto f2 = [&n1];

//改變n1的值

n1 = 1+5;

t = f2();

cout

<<"t2 = "

<1;

//隱式值捕獲

auto f3 = [=];

f3();

//隱式引用捕獲

auto f4 = [&];

f4();

return

0;}

對於只在一倆個地方使用的簡單操作或用到捕獲列表的時候我們用lambda表示式。如果沒用到捕獲列表且需要多次編寫相同的lambda表示式而且函式體比較大時,我們使用函式

C 中Lambda表示式

c 語言還是比較常見的東西,這裡我們主要介紹c lambda表示式,包括介紹乙個lambda就是乙個delegate,乙個delegate指向乙個方法等方面。你有沒有接觸過c lambda表示式,有沒有覺得匿名方法這東西很不錯,減少了很多 阿,但是匿名方法的使用還並不人性化,什麼是人性化呢?比如你可...

lambda表示式 lambda表示式

1.概述 c 11 中的 lambda 表示式用於定義並建立匿名的函式物件,以簡化程式設計工作。lambda 的語法形式如下 函式物件引數 操作符過載函式引數 mutable 或 exception 宣告 返回值型別可以看到,lambda 主要分為五個部分 函式物件引數 操作符過載函式引數 muta...

C 中的Lambda表示式

c 11開始支援lambda表示式 原文 一段簡單的code 我也不是文藝的人,對於lambda的歷史,以及lambda與c 的那段淵源,我也不是很熟悉,技術人,講究拿 說事。複製 如下 include using namespace std int main return 0 當我第一次看到這段 ...