<七>lambda表示式實現原理

Hello_Bugs 發表於 2022-12-08

C++11 函式物件的升級版=>lambda表示式

函式物件的缺點:
使用在泛型演算法,引數傳遞, 比較性質/自定義操作 優先順序佇列, 需要專門定義出一個類

//lambda表示式語法:
//[捕獲外部變數](形參列表)->返回值{操作程式碼}

auto func1=[]()->void{cout<<"hello world"<<endl;}
func1();

//編譯器根據 []()->void{cout<<"hello world"<<endl;} 產生一個函式物件

上面等價於

template<typename T=void>
class TestLamda{

public:
    TestLamda(){}
    void operator(){
        cout<<"hello world"<<endl;
    }
}

TestLamda<> t1;
t1();
[]()->void{cout<<"hello world"<<endl;}
[] 相當於   TestLamda(){}
() 相當於   operator()
void 相當於  void operator()

{cout<<"hello world"<<endl;}  相當於
     void operator(){
        cout<<"hello world"<<endl;
     }

示例2

auto f2=[](int a,int b)->int {int c=a+b;cout<<c<<endl; return c;}

相當於
template<typename T=int>
class TestLamda{

public:
   TestLamda(){}
    int operator(int a, int b){
        int c= a+b;
        cout<<c<<endl;
        return c;
    }
}

如果lambda表示式沒有返回值那麼 "->返回值" 可以不要 最佳化如下
auto f2=[](int a,int b){int c=a+b;cout<<c<<endl; return c;}

關於 [捕獲外部變數]
[]表示不捕獲任何變數
[=] 以傳值得方式捕獲外部的所有變數
[&] 以傳引用的方式捕獲外部所有變數
[this] 捕獲外部的this指標
[=,&a] 以傳值的方式捕獲外部的所有變數,但是a變數以傳引用的方式捕獲
[a,b]  以值傳遞的方式捕獲外部a 和 b
[a,&b] 以值傳遞的方式捕獲a, b以引用的方式傳遞

int a=10;
int b=20;
auto function=[&a,&b](){int temp=a;a=b;b=temp;} //實現a,b交換, 一定要 [&a,&b] 引用 或者
auto function=[&](){int temp=a;a=b;b=temp;}// 表示定義的外部變數全部以引用的方式 傳入,來捕獲.



lambda 簡單應用

vector<int> v1;

//排序
sort(v1.begin(),v1.end(),[](int a, int b)->bool{return a>b;})

//找到 第一個小於65的 值
auto it_find=find_if(v1.begin(),v1.end(),[](int a)->bool{return a<65;})

//列印元素
for_each( ;v1.begin()!=v1.end() ; [](int a){cout<<a<<endl;})

//列印偶數
for_each( ;v1.begin()!=v1.end() ; [](int a){
   if(a%2==0){
      cout<<a<<endl;
   }
   })