C++11:Lambda表达式

lambda表达式是一个匿名类的成员函数

仿函数,又叫做函数对象,因为实现仿函数的方式就是重载一个类的operator()

Lambda表达式实际在底层实现的时候,编译器是完全按照函数对象的方式来处理的,如果我们定义了一个Lambda表达式,编译器会自动生成一个类,在该类中重载operator()

 

复制代码
#include <iostream>
using namespace std;

int main()
{
  []
  {
    cout << "hello lambda" << endl;
  }();    

  return 0;
}

int main()
{
  auto l = []
{
   cout << "hello lambda" << endl;
};
l();
return 0;
}
复制代码

 

复制代码
#include <iostream>
#include <algorithm>
#include <vector>

using namepsace std;

int main()
{
  int a = 10, b = 100;
  auto Add = [](int x, int y)->int {
    return x + y;
  };
  cout << Add(a, b) << end;
  return 0;    
}
复制代码

 

传值方式捕捉变量

复制代码
int main()
{
  int a = 10, b = 20;
  //传值捕捉
  auto Func1 = [a, b]{
    return a + b;
  };
  cout << Func1() << endl;
  return 0;
}
复制代码

 

传引用方式捕捉变量

复制代码
int main()
{
  int a = 10, b =20;
  //传引用捕捉
  auto Func2 = [&a, &b] {
    int tmp = a;
    a = b;
    b = tmp;
  };
  Func2();
  cout << a << "-" << b << endl;
  return 0;
}
复制代码

 

传值方式捕捉父作用域中的所有变量 (包括this) :

复制代码
int main()
{
  int a = 10, b = 20, c = 1, d = 2, e = 3;
  //传值方式捕捉父作用域中的所有变量(包括this)  
  auto Func3 = [=] {
    return a + b + c + d + e;
  };
  cout << Func3() << endl;
  return 0;
}
复制代码

 

传引用方式捕捉父作用域中的所有变量(包括this):

复制代码
int main()
{
  int a = 10, b = 20, c = 1, d = 2, e = 3;
  //传引用方式捕捉父作用域中的所有变量(包括this)
  auto Func4 = [&] {
    a = a + b + c + d + e;
  };  
  Func3();
  cout << a << endl;
  return 0;
}
复制代码

 

混合捕捉:

 

复制代码
int main()
{
  int a = 10, b =20, ret = 0;
  // 混合方式
  auto Func5 = [a, b, &ret]{
    ret = a + b;
  };
  Func5();
  cout << ret << endl;
  
  //ret 传引用捕捉,其他全部传值捕捉
  auto Func6 = [=. &ret]{
    ret = a + b;
  };
  Func6();
  cout << ret << endl;
  return 0;

}
复制代码

 

 

 

Lambda表达式为了一些简单的函数直接调用封装
[var]:表示值传递方式捕捉变量var
[=]:表示值传递捕捉所有父作用域中的变量(包括成员函数中的this)
[&var]:表示引用传递捕捉变量var
[&]:表示引用传递捕捉所有父作用域中的变量(包括成员函数中的this)
[this]:表示值传递方式捕捉当前的this指针

 

//实现add的lambda
auto add = [](int a, int b)->int {return a + b; };
std::cout << add(1, 2) << std::endl;

//实现swap的lambda
auto swap1 = [](int& a, int& b)
{
int temp = a;
a = b;
b = temp;
};

int a = 10, b = 20;
auto swap2 = [&a, &b]
{
int temp = a;
a = b;
b = temp;
};

 

复制代码
//函数对象
class AddUtil
{
  public:
    AddUtil(int a = 0, int b = 0)
      : _a(a), _b(b)
    {
    }

    int operator()()
    {
      return _a + _b;
    }

private:
    int _a;
    int _b;

};

int main()
{
  AddUtil A(10, 20);
  cout << A() << endl;
  return 0;
}
复制代码

 

posted @   言午丶  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示