??C++11系列學(xué)習(xí)之Lambda表達(dá)式
前言:
終于在C++11中引入了lambda表達(dá)式,lambda最早來源于函數(shù)式編程,現(xiàn)代語言慢慢都引入了這個(gè)語法,C++也不甘落后,在新標(biāo)準(zhǔn)中加入了lambda表達(dá)式。
一、為什么要有l(wèi)ambda表達(dá)式?
- 使用方便,就地聲明函數(shù)或函數(shù)對(duì)象,尤其是和bind配合食用更佳
- 簡潔,可以匿名創(chuàng)建,語法看起來極其舒適
- 可以實(shí)現(xiàn)功能閉包,使用起來更加靈活
二、使用語法
lambda的通用語法:[ 捕獲列表] ( 參數(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
的效果是一樣的,但是更加簡潔一些,但不能完全代替,因?yàn)橐恍├系膸觳恢С謑ambda表達(dá)式
到此這篇關(guān)于??C++11系列學(xué)習(xí)之Lambda表達(dá)式的文章就介紹到這了,更多相關(guān)??C++11Lambda表達(dá)式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++?Boost?weak_ptr智能指針超詳細(xì)講解
智能指針是一種像指針的C++對(duì)象,但它能夠在對(duì)象不使用的時(shí)候自己銷毀掉。雖然STL提供了auto_ptr,但是由于不能同容器一起使用(不支持拷貝和賦值操作),因此很少有人使用。它是Boost各組件中,應(yīng)用最為廣泛的一個(gè)2022-11-11C語言用棧實(shí)現(xiàn)十進(jìn)制轉(zhuǎn)換為二進(jìn)制的方法示例
這篇文章主要介紹了C語言用棧實(shí)現(xiàn)十進(jìn)制轉(zhuǎn)換為二進(jìn)制的方法,結(jié)合實(shí)例形式分析了C語言棧的定義及進(jìn)制轉(zhuǎn)換使用技巧,需要的朋友可以參考下2017-06-06深入學(xué)習(xí)C++智能指針之shared_ptr與右值引用的方法
智能指針的核心實(shí)現(xiàn)技術(shù)是引用計(jì)數(shù),每使用它一次,內(nèi)部引用計(jì)數(shù)加1,每析構(gòu)一次內(nèi)部的引用計(jì)數(shù)減1,減為0時(shí),刪除所指向的堆內(nèi)存,今天通過本文給大家分享C++智能指針之shared_ptr與右值引用的方法,需要的朋友跟隨小編一起看看吧2021-07-07