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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)