1. 程式人生 > >C++11 新特性:Lambda 表示式

C++11 新特性:Lambda 表示式

或許,Lambda 表示式算得上是 C++ 11 新增特性中最激動人心的一個。這個全新的特性聽起來很深奧,但卻是很多其他語言早已提供(比如 C#)或者即將提供(比如 Java)的。簡而言之,Lambda 表示式就是用於建立匿名函式的。GCC 4.5.x 和 Microsoft Visual Studio 早已提供了對 lambda 表示式的支援。在 GCC 4.7 中,預設是不開啟 C++ 11 特性的,需要新增  -std=c++11 編譯引數。而 VS2010 則預設開啟。

為什麼說 lambda 表示式如此激動人心呢?舉一個例子。標準 C++ 庫中有一個常用演算法的庫,其中提供了很多演算法函式,比如 sort() 和 find()。這些函式通常需要提供一個“謂詞函式 predicate function”。所謂謂詞函式,就是進行一個操作用的臨時函式。比如 find() 需要一個謂詞,用於查詢元素滿足的條件;能夠滿足謂詞函式的元素才會被查找出來。這樣的謂詞函式,使用臨時的匿名函式,既可以減少函式數量,又會讓程式碼變得清晰易讀。

下面來看一個例子:

C++
123456789#include <algorithm>#include <cmath>voidabssort(float*x,unsignedN){std::sort(x,x+N,[](floata,floatb){returnstd::abs(a)<std::abs(b);});}

從上面的例子來看,儘管支援 lambda 表示式,但 C++ 的語法看起來卻很“神奇”。lambda 表示式使用一對方括號作為開始的標識,類似於宣告一個函式,只不過這個函式沒有名字,也就是一個匿名函式。這個匿名函式接受兩個引數,a

b;其返回值是一個 bool 型別的值,注意,返回值是自動推斷的,不需要顯式宣告,不過這是有條件的!條件就是,lambda 表示式的語句只有一個 return。函式的作用是比較 a、b 的絕對值的大小。然後,在此例中,這個 lambda 表示式作為一個閉包被傳遞給 std::sort() 函式。

下面,我們來詳細解釋下這個神奇的語法到底代表著什麼。

我們從另外一個例子開始:

C++
1 std::cout<<[](floatf){returnstd::abs(f);}(-3.5);

輸出值是什麼?3.5!注意,這是一個函式物件(由 lambda 表示式生成),其實參是 -3.5,返回值是引數的絕對值。lambda 表示式的返回值型別是語言自動推斷的,因為std::abs()

的返回值就是 float。注意,前面我們也提到了,只有當 lambda 表示式中的語句“足夠簡單”,才能自動推斷返回值型別。

C++ 11 的這種語法,其實就是匿名函式宣告之後馬上呼叫(否則的話,如果這個匿名函式既不呼叫,又不作為閉包傳遞給其它函式,那麼這個匿名函式就沒有什麼用處)。如果你覺得奇怪,那麼來看看 JavaScript 的這種寫法:

JavaScript
123function(){}();function(a){}(-3.5);

C++ 11 的寫法完全類似 JavaScript 的語法。

如果我不想讓 lambda 表示式自動推斷型別,或者是 lambda 表示式的內容很複雜,不能自動推斷怎麼辦?比如,std::abs(float)的返回值是 float,我想把它強制轉型為 int。那麼,此時,我們就必須顯式指定 lambda 表示式返回值的型別:

C++

相關推薦

C++11 特性Lambda 表示式

或許,Lambda 表示式算得上是 C++ 11 新增特性中最激動人心的一個。這個全新的特性聽起來很深奧,但卻是很多其他語言早已提供(比如 C#)或者即將提供(比如 Java)的。簡而言之,Lambda 表示式就是用於建立匿名函式的。GCC 4.5.x 和 Micro

15、【C++】C++11特性Lamda表示式/可變引數模板

一、Lamda表示式     Lamda表示式是C++11中引入的一項新技術,利用Lamda表示式可以編寫內嵌的匿名函式,用以替換獨立函式或者函式物件,並且使得程式碼更可讀。是一種匿名函式,即沒有函式名的函式;Lamda函式的語法定義如下: [capture] :捕捉

C++11特性Lambda函式(匿名函式)

基本的Lambda函式 我們可以這樣定義一個Lambda函式: #include <iostream> using namespace std; int main() { auto func = [] () { c

c++0x的特性lambda表示式

(本文摘自c++論壇裡自己帖子的回覆。) GCC4.5引入這個特性。有興趣的朋友可以編譯測試下面這段程式碼: #include <algorithm> #include <cmath> void abssort(float *x, unsigned

C++11特性function, bind和lambda

function, bind和lambda:bind中使用std::ref和std::cref,bind中預設使用的拷貝,而不是引用,根據實際情況,可使用std::ref和std::cref將引數設定為引用lambda:下面我們來總結下所有出現的 lambda 引入符:[]

看透Java8特性lambda表示式和Stream API

Java11前兩天都發布了,Java8還沒搞清都有啥,這就很尷尬了~ Java8 的新特性:Lambda表示式、強大的 Stream API、全新時間日期 API、ConcurrentHashMap、MetaSpace。Java8 的新特性使 Java 的執行速度更快、程式碼更少(Lambda 表示式)、便

Java8特性Lambda表示式和函式式介面

Java8新特性:速度更快,程式碼更少,stream API,便於並行,最大化減少空指標異常:Optional Lambda表示式 好處: Lambda是一個匿名函式,可以把lambda表示式理解為一

十分鐘學會Java8特性lambda表示式和Stream API

Java8 的新特性:Lambda表示式、強大的 Stream API、全新時間日期 API、ConcurrentHashMap、MetaSpace。總得來說,Java8 的新特性使 Java 的執行速度更快、程式碼更少、便於並行、最大化減少空指標異常。 這篇文章分享之前我還是要推薦下我

C++11特性移動語義和右值引用

右值引用 傳統的C++引用(左值引用)使得識別符號關聯到左值。左值是一個表示資料的表示式(如變數名或解除引用的指標),程式可以獲得其地址。 C++11新增了右值引用。右值引用,顧名思義,可以關聯到右值,即——可以出現在賦值表示式的右邊,但不能對其應用地址運算

C++11特性Lambda函式

我是搞C++的 一直都在提醒自己,我是搞C++的;但是當C++11出來這麼長時間了,我卻沒有跟著隊伍走,發現很對不起自己的身份,也還好,發現自己也有段時間沒有寫C++程式碼了。今天看到了C++中的Lambda表示式,雖然用過C#的,但是C++的,一直沒有用,也不知道怎麼

Java 8 特性Lambda 表示式之方法引用(Lambda 表示式補充版)

方法引用 文 | 莫若吻      (注:此文乃個人查詢資料然後學習總結的,若有不對的地方,請大家指出,非常感謝!) 1.方法引用簡述 方法引用是用來直接訪問類或者例項的已經存在的方法或

C++ 11學習(1)lambda表示式

#include <iostream> #include <vector> #include <functional> using namespace std; vector<function<int(int)>&

C++11特性尾置返回型別

尾置返回型別是在C++11標準中新增的語法,可以用於任何函式定義中,旨在方便複雜函式的定義。尾置返回型別跟在形參列表後面並以一個->符號開頭。為了表示函式真正的返回型別跟在形參列表之後,需要在本應該出現返回型別的地方放置一個auto關鍵字。//宣告一個返回指向陣列的指

14.C++11 標準foreach、右值引用&&、lambda表示式、語言級別的執行緒與鎖

關鍵字和新語法 1、delete      指定刪除類的成員方法         在類的成員方法後面寫  = delete  就將該成員方法刪除,使用者無法呼叫。 智慧指標unique_ptr就是將物件的拷貝構造和operator=  delete刪除了 2、auto

C++11特性——lambda表達式

amp 多個 str exp href 似的 exception 定義 參數傳遞 C++11的一大亮點就是引入了Lambda表達式。利用Lambda表達式,可以方便的定義和創建匿名函數。對於C++這門語言來說來說,“Lambda表達式”或“匿名函數”這些概念聽起來好像很深奧

C++11特性(74)-正則表示式庫(regular-expression library)

正則表示式(regular expression)是一種描述字元序列的方法,從C++11起,C++正則表示式庫(regular-expression library)成為新標準庫的一部分。 由於正則表示式本身就是一個非常龐大的系統,本文只介紹C++中使用正則表示式的小例子,淺嘗輒止。 基

C++11特性之十enable_shared_from_this

 enable_shared_from_this是一個模板類,定義於標頭檔案<memory>,其原型為: template< class T > class enable_shared_from_this;        std::enable_s

C++30分鐘瞭解C++11特性

什麼是C++11 C++11是曾經被叫做C++0x,是對目前C++語言的擴充套件和修正,C++11不僅包含核心語言的新機能,而且擴充套件了C++的標準程式庫(STL),併入了大部分的C++ Technical Report 1(TR1)程式庫(數學的特殊函式除外)。 C+

c++11 特性實戰 (一)多執行緒操作

# c++11 新特性實戰 (一) ## c++11多執行緒操作 * 執行緒 * **thread** ```c++ int main() { thread t1(Test1); t1.join(); thread t2(Test2);

c++11特性實戰(二)智慧指標

## c++11新特性實戰(二):智慧指標 c++11添加了新的智慧指標,unique_ptr、shared_ptr和weak_ptr,同時也將auto_ptr置為廢棄(deprecated)。 但是在實際的使用過程中,很多人都會有這樣的問題: 1. 不知道三種智慧指標的具體使用場景 2. 無腦只使用