在介紹lambda表示式之前,我想先介紹以下c++標準庫所支援的傳統謂詞以及傳統謂次的不足,而由此才引入的lambda表示式
謂詞是個可呼叫的表示式,其返回結果是乙個能作為條件的值。謂詞分為一元和二元,一元的可呼叫物件只能有乙個引數,二元只能有倆個引數
我們以一元謂詞舉例:
c++標準庫中的find_if()函式,它的功能是這樣的。該函式接收一對迭代器,表示乙個範圍,它的第三個引數是乙個謂詞,其迭代器範圍內的每乙個元素都會執行這個謂詞操作,它返回第乙個使謂詞非0的元素的迭代器,否則返回尾迭代器
具體例項如下
#include
#include
#include
using
namespace
std;
//謂詞
bool judge(const
int &x)
int main(void)
; auto it = find_if(v.begin(),v.end(),judge);
if(it == v.end())
在如上程式中我通過謂詞judge找到了第乙個大於5的元素,那麼問題來了,如果我要找第乙個大於6的元素呢?我想很多人會說那就在寫乙個judge函式。不得不承認這是一種解此問題的方法,可是如果我的程式需要一直修改所大於數的值呢?顯然只靠上述辦法是不行的。那麼又會有人說給謂詞加個引數,讓它去傳遞所大於數的值不就好了。我對此回答只能說想法是好的,只是find_if函式只支援一元謂詞,你加個引數就成二元謂詞了。我想說到這裡大家感覺沒招了吧,這個時候lambda就該現世了^_^
lambda表示也是一種可呼叫物件,其與函式最大的區別就是它可以定義在函式的內部,它的具體形式如下
[捕獲鍊錶](引數列表)->返回型別
其中捕獲列表是lambda所在函式的區域性變數的列表(可以為空),引數列表和函式體與函式表示意義相同,但是與函式不同的是lambda必須使用尾置返回來指定返回型別
在平時的使用當中我們可以忽略引數列表和返回型別,但至少得包含捕獲列表和函式體
//定義磕掉用物件f
auto f = ;
//我們可以像呼叫普通函式一樣呼叫它
cout
《注意:如果lambda的函式體裡只有乙個return 語句,則預設的返回型別與return 的返回型別一致,否則預設其的返回型別為void
上面介紹了那麼多無非就是想學習一下lambda好用來解我們之前的那個問題,接下來就為大家說明解它的方法
首先我感覺我們上面所遇到的核心問題應該是find_if演算法只支援一元謂詞,意味這只能給其傳遞乙個引數,那麼我們之前所想的方法的另乙個引數得咋麼傳呢?沒錯,由於通過捕獲列表可以獲得呼叫lambda的函式的區域性變數,我們何不就通過捕獲列表來控制此引數呢,廢話不說,直接上**
#include
#include
#include
using
namespace
std;
int main(void)
; int n;
cout
<<"請輸入所要查詢的數要比哪個數大";
cin>>n;
auto it = find_if(v.begin(),v.end(),[n](const
int &x));
if(it == v.end())
可以看的出來利用lambda表示式可以輕鬆解決我們之前的問題^_^
(1)值捕獲
與引數不同,**獲的變數值是在lambda建立時拷貝,而不是呼叫時拷貝,因此隨後對變數進行修改,將不會影響lambda內對應的值
例項
int n = 66;
//捕獲n
auto f = [n](void);
n = 55;
//此時t依然是66
auto t = f();
(2)引用捕獲
我們也可以在捕獲列表中的變數名前加&此種捕獲方式便是引用捕獲。當我們在lambda函式體內使用變數時,其實就是在使用引用所繫結的實體
具體例項如下
int n = 66;
//引用n
auto f = [&n](void);
n = 55;
此時t為66
int t = f();
(3)隱式捕獲
除了顯示的列出我們希望使用的來自所有函式的變數之外,還可以讓編譯器根據lambda體中的**來推斷我們要使用哪些變數。為了指示編譯器推斷捕獲列表,應在捕獲列表中寫乙個&或=。&表示採用引用捕獲,=表示採用值捕獲方式
例項如下
int n1 = 2;
int n2 = 3;
int n3 = 4;
//此lambda表示式表示除了n2為值捕獲外,其他剩餘所有區域性變數都為引用捕獲
auto f = [&,n2](void);
(4)關於捕獲列表完全體例項**
#include
#include
#include
#include
using
namespace
std;
int main(void)
; //改變n1的值
n1 = 1+5;
int t = f1();
cout
<<"t1 = "
<1;
//以引用捕獲n1;
auto f2 = [&n1];
//改變n1的值
n1 = 1+5;
t = f2();
cout
<<"t2 = "
<1;
//隱式值捕獲
auto f3 = [=];
f3();
//隱式引用捕獲
auto f4 = [&];
f4();
return
0;}
對於只在一倆個地方使用的簡單操作或用到捕獲列表的時候我們用lambda表示式。如果沒用到捕獲列表且需要多次編寫相同的lambda表示式而且函式體比較大時,我們使用函式 C 中Lambda表示式
c 語言還是比較常見的東西,這裡我們主要介紹c lambda表示式,包括介紹乙個lambda就是乙個delegate,乙個delegate指向乙個方法等方面。你有沒有接觸過c lambda表示式,有沒有覺得匿名方法這東西很不錯,減少了很多 阿,但是匿名方法的使用還並不人性化,什麼是人性化呢?比如你可...
lambda表示式 lambda表示式
1.概述 c 11 中的 lambda 表示式用於定義並建立匿名的函式物件,以簡化程式設計工作。lambda 的語法形式如下 函式物件引數 操作符過載函式引數 mutable 或 exception 宣告 返回值型別可以看到,lambda 主要分為五個部分 函式物件引數 操作符過載函式引數 muta...
C 中的Lambda表示式
c 11開始支援lambda表示式 原文 一段簡單的code 我也不是文藝的人,對於lambda的歷史,以及lambda與c 的那段淵源,我也不是很熟悉,技術人,講究拿 說事。複製 如下 include using namespace std int main return 0 當我第一次看到這段 ...