C 11帶來的lambda表示式

2021-06-07 07:04:41 字數 3787 閱讀 9109

c++11帶來了lambda表示式,可以簡化程式的編寫,使**更加清晰。

現在按照步驟來介紹lambda表示式:

1.函式物件

又叫仿函式,如果乙個類或者結構體重載了operator()操作符,那麼該類產生的物件就是乙個函式物件,例如,有這樣乙個student結構體:

struct student 

};

如果想對studeng使用id來進行排序,那麼可以寫這樣乙個比較器:

struct compareid 

};

這就是乙個函式物件,因為過載了operator()

2.使用bind簡化

使用標準庫里的sort函式進行排序的話,看看sort函式的原型:

template void sort ( randomaccessiterator first, randomaccessiterator last, compare comp );

其中的compare comp就是乙個函式物件,既然我們已經有了compareid這個函式物件,就可以使用sort來排序:

int main(int argc, char* argv) ;

sort(a, a + 3, compareid());

for(int i=0; i<3; ++i)

};

用這個函式物件替換上邊的compareid,就可以完成對name的排序,但顯然比較麻煩,因為要自己寫比較用的函式物件。可以使用bind來簡化:

sort(a, a+3, bind(less(), bind(&student::id, _1), bind(&student::id, _2)));

sort(a, a+3, bind(less(), bind(&student::name, _1), bind(&student::name, _2)));

這是乙個bind的巢狀使用,內層的bind把乙個成員變數轉化成乙個函式物件,繫結引數1和2,外層的bind使用std提供的less函式物件完成對兩個比較引數的函式物件的繫結。

3.lambda表示式

但是上述用bind來實現還是比較複雜,先看看labbda表示式如何簡化之:

sort(a, a+3, (const student& val1, const student& val2));
那麼上述的兩種比較就可以這樣來完成:

int main(int argc, char* argv) ;

sort(a, a + 3,

(const student& val1, const student& val2) );

for_each(a, a + 3,

(const student& val) ;

程式的第二行是乙個

lambda

表示式,

lambda

裡能出現的東西幾乎全了(當然,正如我在前文說的,有一些其它資訊這裡不做討論,所以沒有加入其中)。讓我們對裡面的東西一一分析:

l[n]

是lambda-introducer,而n

是乙個變數,表明該表示式作用域中的變數

n將被傳入這個表示式。以本程式為例,傳入的值是10。

lambda-introducer

可以指定變數以值的方式傳入,也可以用其它的形式指定其以引用的方式傳入。其變型大家就

一下吧j l

(int k)

表示了引數列表,屬於

lambda-declarator

的一部分。你可以把表示式看成乙個仿函式(如上文的)。這裡指定了仿函式的引數列表。如果函式的引數列表為空,這一部分可以省略。

lmutable

表示仿函式中的變數能否改變。以前文中

compareid

這個仿函式為例,注意到其中的

operator ()

是const

的。如果

lambda

表示式中引入了這個

mutable

,則對應的仿函式中

operator()

的定義將不包含這個

const

——這意味著仿函式中的變數值(

lambda-introducer

傳入)可以改變。討論

operator() const

與operator()

c++相關教程吧j

l-> int 

表示返回型別(這裡是

int)。如果編譯器能從**中推斷出返回型別,或者

lambda

表示式的返回型別為

void

,則該項可省略;l是

compound-statement

:函式體。

通過分析可以看出,這個

lambda

表示式相當於乙個函式,該函式讀入乙個

int值

k,將該值加上

n返回。根據上述說明,這個表示式可以簡寫為:

[n](int k);

lambda表示式可以儲存在std::function或

std:: reference_closure型別的變數中。其中的

t表示了表示式對應函式的型別。以上述表示式為例,它輸入引數為

int型變數,輸出為

int,那麼為了儲存它,可以寫成如下的形式:

functiong = [n](int k);

另乙個例子,前文所使用的

lambda表示式:

(const student& val1, const student& val2)

可以儲存於functionconst

student&, const student&

)>這個型別的變數中。

如果你嫌這麼寫麻煩,也可以利用

c++新標準中另乙個新特性:型別推導。即用

auto作為變數的型別,讓編譯器自己推導表示式的型別:

auto g = [n](int k);

沒問題,這樣寫

g還是乙個強型別的變數,只不過其型別是由編譯器推導的,好處是你不用寫太長的變數型別了

jlambda表示式高階

作為結尾,我們來看一些

c++ lambda

表示式高階的用法。

lambda表示式被引入主要是用於函式式程式設計。有了

lambda表示式,我們也可以做一些函式式程式設計的東西。比如將乙個函式作為返回值的應用:

auto g = (int n) -> function;

functionf = g(2);

for_each(a, a+10, f);

它將輸出:

3 4 5 6 7 8 9 10 11 2

有一點函式式程式設計的味道了

j至於其它的東西,比如如下的表示式:

(){}();

是乙個有效的呼叫。其中

「(){}

」表示乙個

lambda

表示式,其輸入引數為空,返回

void

,什麼都不幹。而最後的

()表示呼叫其求值——雖然什麼都不幹,但編譯能通過,很唬人喔j

好了,就寫到這裡吧。關於

lambda

表示式想說的最後一件事是:它是新標準

c++11

中定義的。老的編譯器不支援(這也是我用

vs2010

的原因)。想要用它,以及其它新標準帶來的好處嗎?嘿,你的傢伙(指編譯器)該公升級了

c 11的lambda表示式

c 11的一大亮點就是引入了lambda表示式。利用lambda表示式,可以方便的定義和建立匿名函式。對於c 這門語言來說來說,lambda表示式 或 匿名函式 這些概念聽起來好像很深奧,但很多高階語言在很早以前就已經提供了lambda表示式的功能,如c python等。lambda表示式就是匿名函...

C 11 標準 Lambda表示式

c 11標準新增加了lambda表示式,以後小函式可以直接內嵌lambda表示式搞定了。例如排序,我們以前要這麼寫 include include include bool compare const int a,const int b using namespace std int main so...

c 11之lambda表示式

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