C++11新特性(30)- lambda表達(dá)式(1)
泛型算法中的定制操作
很多算法都會(huì)比較輸入序列中的元素,通過(guò)定制比較動(dòng)作,可以控制算法按照編程者的意圖工作。本文以string排序?yàn)槔M(jìn)行說(shuō)明,首先是缺省的排序動(dòng)作:
?
vectorv{"This","is", "a", "predicate", "."};
sort(v.begin(), v.end());
for(auto s:v){
? ?cout << s << endl;
}
代碼的輸出如下:
.
This
a
is
predicate
缺省動(dòng)作是按照字母順序排序的。
謂詞
假如有一個(gè)需求,希望按照字符串長(zhǎng)度從小到大排序??梢韵榷x一個(gè)比較函數(shù)。
bool compare(const string& s1, const string& s2){
? ?return s1.size() < s2.size();
}
然后將這個(gè)函數(shù)傳遞給sort算法即可:
sort(v.begin(), v.end(), compare);
for(auto s:v){
? ?cout << s << endl;
}
代碼的輸出如下:
.
a
is
This
predicate
這種作為參數(shù)傳遞給sort算法的函數(shù)可以看作一個(gè)動(dòng)作,它有一個(gè)名稱:謂詞。
lambda表達(dá)式
前面的例子中,定義了一個(gè)函數(shù)傳遞給sort算法。這個(gè)函數(shù)可以重復(fù)使用還好,如果只是用使用一次的話就顯得比較麻煩。這種情況下可以使用C++11提供的新特性:lamada表達(dá)式。代碼如下:
sort(v.begin(), v.end(),
? ? [](const string& s1, const string& s2){
? ? ? ?return s1.size() > s2.size();
? ? ?});
for(auto s:v){
? ?cout << s << endl;
}
和使用謂詞的情況比較可以看到:
沒(méi)有定義函數(shù)(沒(méi)有函數(shù)名)。
依然定義了動(dòng)作,參數(shù)。
由于執(zhí)行代碼的內(nèi)容中小于號(hào)變成了大于號(hào),代碼的輸出就變成了下面這樣。
predicate
This
is
.
a
這種沒(méi)有定義函數(shù)的指定動(dòng)作(謂詞)的方式就是lambda表達(dá)式。
作者觀點(diǎn)
lambda表達(dá)式在javascript等語(yǔ)言中早已存在,C++終于算是趕上潮流了。