??C++11系列學(xué)習(xí)之Lambda表達式
前言:
終于在C++11中引入了lambda表達式,lambda最早來源于函數(shù)式編程,現(xiàn)代語言慢慢都引入了這個語法,C++也不甘落后,在新標(biāo)準(zhǔn)中加入了lambda表達式。
一、為什么要有l(wèi)ambda表達式?
- 使用方便,就地聲明函數(shù)或函數(shù)對象,尤其是和bind配合食用更佳
- 簡潔,可以匿名創(chuàng)建,語法看起來極其舒適
- 可以實現(xiàn)功能閉包,使用起來更加靈活
二、使用語法
lambda的通用語法:[ 捕獲列表] ( 參數(shù)表 ) 函數(shù)選項 -> 返回值類型 { 函數(shù)體 ;};
捕獲列表
- [] 不捕獲任何變量
- [&] 以引用方式捕獲外部作用域中所有變量
- [=] 以值的方式捕獲外部作用域中的所有變量
- [= , &x] 以值方式捕獲外部作用域變量,但是以引用方式捕獲x變量
- [ x ] 按值方式捕獲 x 變量
- [ this ] 捕獲當(dāng)前類的this指針,那么lambda表達式擁有了和類成員函數(shù)同樣的權(quán)限,如果使用了& 或 = 那么默認添加了此項
mutable影響lambda表達式
被mutable 修飾的lambda表達式就算沒有參數(shù)也要寫明參數(shù)列表,若沒有加mutable,lambda不能修改這個變量的值,只能使用。 但是被修飾后的lambda表達式,會像函數(shù)傳遞參數(shù)一樣,在內(nèi)部定義一個變量并拷貝這個值。
#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; }
可以把它視為帶有重載括號運算符的仿函數(shù),并且沒有捕獲任何變量的lambda表達式可以被轉(zhuǎn)換成一個普通的函數(shù)指針
//用std::function來存儲和操作lambda表達式 std::function<int, int> f1 = [](int a){ return a}; //轉(zhuǎn)換為一個普通的函數(shù)指針 using fun = int(*){int}; fun f =[](int a){return a;} f(1)
std::bind和lambda表達式結(jié)合
//eg : 用來集合中計算大于5小于10的元素的個數(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表達式選擇
lambda
和std::function
的效果是一樣的,但是更加簡潔一些,但不能完全代替,因為一些老的庫不支持lambda表達式
到此這篇關(guān)于??C++11系列學(xué)習(xí)之Lambda表達式的文章就介紹到這了,更多相關(guān)??C++11Lambda表達式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言用棧實現(xiàn)十進制轉(zhuǎn)換為二進制的方法示例
這篇文章主要介紹了C語言用棧實現(xiàn)十進制轉(zhuǎn)換為二進制的方法,結(jié)合實例形式分析了C語言棧的定義及進制轉(zhuǎn)換使用技巧,需要的朋友可以參考下2017-06-06深入學(xué)習(xí)C++智能指針之shared_ptr與右值引用的方法
智能指針的核心實現(xiàn)技術(shù)是引用計數(shù),每使用它一次,內(nèi)部引用計數(shù)加1,每析構(gòu)一次內(nèi)部的引用計數(shù)減1,減為0時,刪除所指向的堆內(nèi)存,今天通過本文給大家分享C++智能指針之shared_ptr與右值引用的方法,需要的朋友跟隨小編一起看看吧2021-07-07