??C++11系列學(xué)習(xí)之Lambda表達(dá)式
前言:
終于在C++11中引入了lambda表達(dá)式,lambda最早來源于函數(shù)式編程,現(xiàn)代語(yǔ)言慢慢都引入了這個(gè)語(yǔ)法,C++也不甘落后,在新標(biāo)準(zhǔn)中加入了lambda表達(dá)式。
一、為什么要有l(wèi)ambda表達(dá)式?
- 使用方便,就地聲明函數(shù)或函數(shù)對(duì)象,尤其是和bind配合食用更佳
- 簡(jiǎn)潔,可以匿名創(chuàng)建,語(yǔ)法看起來極其舒適
- 可以實(shí)現(xiàn)功能閉包,使用起來更加靈活
二、使用語(yǔ)法
lambda的通用語(yǔ)法:[ 捕獲列表] ( 參數(shù)表 ) 函數(shù)選項(xiàng) -> 返回值類型 { 函數(shù)體 ;};
捕獲列表
- [] 不捕獲任何變量
- [&] 以引用方式捕獲外部作用域中所有變量
- [=] 以值的方式捕獲外部作用域中的所有變量
- [= , &x] 以值方式捕獲外部作用域變量,但是以引用方式捕獲x變量
- [ x ] 按值方式捕獲 x 變量
- [ this ] 捕獲當(dāng)前類的this指針,那么lambda表達(dá)式擁有了和類成員函數(shù)同樣的權(quán)限,如果使用了& 或 = 那么默認(rèn)添加了此項(xiàng)
mutable影響lambda表達(dá)式
被mutable 修飾的lambda表達(dá)式就算沒有參數(shù)也要寫明參數(shù)列表,若沒有加mutable,lambda不能修改這個(gè)變量的值,只能使用。 但是被修飾后的lambda表達(dá)式,會(huì)像函數(shù)傳遞參數(shù)一樣,在內(nèi)部定義一個(gè)變量并拷貝這個(gè)值。
#include <iostream>
using namespace std;
int main()
{
size_t t = 9;
auto f = [t] () mutable {return ++t; };
cout << f() << endl; //10
cout << f() << endl; //11
cout << "t:" << t << endl; //9
return 0;
}可以把它視為帶有重載括號(hào)運(yùn)算符的仿函數(shù),并且沒有捕獲任何變量的lambda表達(dá)式可以被轉(zhuǎn)換成一個(gè)普通的函數(shù)指針
//用std::function來存儲(chǔ)和操作lambda表達(dá)式
std::function<int, int> f1 = [](int a){ return a};
//轉(zhuǎn)換為一個(gè)普通的函數(shù)指針
using fun = int(*){int};
fun f =[](int a){return a;}
f(1)std::bind和lambda表達(dá)式結(jié)合
//eg : 用來集合中計(jì)算大于5小于10的元素的個(gè)數(shù) auto f = std::(std::logical_and<bool>(), std::bind( std::greater<int>(), _1, 5), std::bind(std::lesss<int>(),_1, 10)); int count = std::count::_if(coll.bengin(), coll.end(),f);
三、std::function 和lambda表達(dá)式選擇
lambda和std::function的效果是一樣的,但是更加簡(jiǎn)潔一些,但不能完全代替,因?yàn)橐恍├系膸?kù)不支持lambda表達(dá)式
到此這篇關(guān)于??C++11系列學(xué)習(xí)之Lambda表達(dá)式的文章就介紹到這了,更多相關(guān)??C++11Lambda表達(dá)式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++中幾種將整數(shù)轉(zhuǎn)換成二進(jìn)制輸出的方法總結(jié)
下面小編就為大家?guī)硪黄狢++中幾種將整數(shù)轉(zhuǎn)換成二進(jìn)制輸出的方法總結(jié)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-09-09
c++ lambda捕獲this 導(dǎo)致多線程下類釋放后還在使用的錯(cuò)誤問題
Lambda表達(dá)式是現(xiàn)代C++的一個(gè)語(yǔ)法糖,挺好用的。但是如果使用不當(dāng),會(huì)導(dǎo)致內(nèi)存泄露或潛在的崩潰問題,這里總結(jié)下c++ lambda捕獲this 導(dǎo)致多線程下類釋放后還在使用的錯(cuò)誤問題,感興趣的朋友一起看看吧2023-02-02
使用Qt實(shí)現(xiàn)旋轉(zhuǎn)動(dòng)畫效果
這篇文章主要為大家詳細(xì)介紹了如何使用Qt實(shí)現(xiàn)旋轉(zhuǎn)動(dòng)畫效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-11-11
C語(yǔ)言中宏和函數(shù)的9個(gè)區(qū)別詳解
C語(yǔ)言中的宏和函數(shù)是非常相似的,它們都可以完成類似的功能。本文為大家整理了C語(yǔ)言中宏和函數(shù)的9個(gè)區(qū)別,感興趣的小伙伴可以跟隨小編一起了解一下2023-04-04
你知道如何自定義sort函數(shù)中的比較函數(shù)
這篇文章主要介紹了如何自定義sort函數(shù)中的比較函數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
C++實(shí)現(xiàn)十六進(jìn)制字符串轉(zhuǎn)換為十進(jìn)制整數(shù)的方法
這篇文章主要介紹了C++實(shí)現(xiàn)十六進(jìn)制字符串轉(zhuǎn)換為十進(jìn)制整數(shù)的方法,涉及C++字符串與數(shù)制轉(zhuǎn)換的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07

