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





