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...