Lambda 表达式

五子棋AI算法第一篇-我对谷歌Alphago的看法 最近Google宣布他们的围棋AI以5:0的战绩打败欧洲围棋三冠王。我一直对人工智能比较感兴趣,正好趁年前空闲的几天用JS写了一个五子棋的AI。其实很久以前就用自创的算法写过一个JAVA版的五子棋AI,不过棋力很不理想。这次用的是JS写的,所以无论任何平台上只要能打开网页的都可以玩。google爆出这个新闻之后,很多人觉得这是不是意味着电脑智商已经在人类之上了,围棋已经没有意义了之类的。甚至觉得这是 阅读详情

✅ 一、Lambda 是什么

一句话:

Lambda 表达式 = 轻量函数(匿名函数)

不需要声明名字、不需要单独写函数体,直接在代码里用。

✳ 二、C++ Lambda 基本格式

C++ 最完整语法:

[capture](parameter_list) mutable noexcept -> return_type { body }
最常见精简格式:

[&](int x){ return x + 1; }
✳ 三、参数说明

部分含义
[capture]捕获外部变量
(parameter_list)参数列表
mutable允许修改捕获变量
return_type返回类型
{ body }实现代码

⚡ 四、捕获(capture)的写法重点

捕获方式决定 Lambda 能否访问外部变量

例1:按值捕获

int a = 10;
auto f = [a]() { return a + 1; };
例2:按引用捕获

int a = 10;
auto f = [&a]() { a++; };
f();
执行后 a == 11

例3:全部按值捕获

[=]() { ... }
例4:全部按引用捕获

[&]() { ... }
例5:混合捕获

[=,&x](){ ... }
🧰 五、典型使用场景

① 线程回调 / 异步执行

std::thread t([]{
    printf("worker\n");
});
t.join();
② STL 回调(最常用)

std::vector<int> v{1,2,3,4};
std::for_each(v.begin(), v.end(), [](int x){
    std::cout << x << " ";
});
③ 排序自定义

std::sort(v.begin(), v.end(),
    [](int a, int b){ return a > b; });
🔧 六、底层实现

C++ Lambda 本质是:

编译器生成一个匿名类(仿函数 functor)

int a = 10;
auto f = [a]() { return a+1; };
等价于:

struct _Lambda {
    int a;
    int operator()() const {
        return a+1;
    }
};

所以:

  • 捕获变量 → 编译器生成成员变量

  • 调用 → 通过 operator() 执行

这一点和 std::function / function pointer 不一样。

🚩 七、常见坑

❗ 1. 捕获值不会更新原变量

int a = 10;
auto f = [a](){ return a++; };
f();
printf("%d\n", a);  // 输出 10(不会变)

需要引用:

auto f = [&a](){ a++; };
❗ 2. 捕获 this
类内使用很常见:

auto f = [this]() { this->run(); };
🚀 八、和函数指针对比

函数指针Lambda
是否捕获外部变量❌ 不行✔ 可以
创建方式需要函数名无名即可
内联优化一般强
易用性差好

高级用法:

1️⃣ 泛型 Lambda (C++14+)

允许参数类型自动推断:

auto add = [](auto a, auto b){ return a + b; };

add(1, 2);       // int
add(1.5, 2.2);   // double
add("a"s, "b"s); // string
2️⃣ 可变参数 Lambda (C++20)

auto print = [](auto... args){
    (std::cout << ... << args) << "\n";
};

print(1, "hello", 3.14);
3️⃣ mutable 捕获值可修改

默认按值捕获是 const 的:

int x = 10;
auto f = [x]() mutable {
    x++;
    return x;
};
f(); // 11
4️⃣ 捕获 this 指针

类内非常常见:

auto f = [this] { doWork(); };
如果你写:

[=]
类内也隐式捕获 this

但 C++20 允许捕获 this 的副本(防悬垂):

auto f = [*this] { doWork(); };

等于复制整个对象避免悬空指针。


5️⃣ 初始化捕获(C++14+重要能力)

auto f = [val = std::move(bigObj)] {
    use(val);
};
变量 val 只存在 Lambda 内
特别适合智能指针:

auto f = [p = std::make_shared<int>(5)] {
    std::cout << *p;
};
甚至可以这样:

auto f = [i=0]() mutable {
    return ++i;
};
f(); //1
f(); //2
这种行为 = 闭包(closure)状态保持

6️⃣ constexpr Lambda(C++17+)

constexpr auto sqr = [](int x) { return x*x; };
static_assert(sqr(5) == 25);
还能在编译期算 Fibonacci:

constexpr auto fib = [](int n){
    if (n <= 1) return n;
    return fib(n-1) + fib(n-2);
};

7️⃣ 返回类型显式指定

当需要强制返回类型:

auto f = [](int x) -> double {
    if(x > 0) return x;
    return 0.5;
};
8️⃣ Lambda + std::function

⚠ 注意性能区别:

std::function<int(int)> f = [](int x){ return x + 1; };

会发生:

  • 类型擦除

  • 动态分配(可能)

  • 低效

推荐保留 auto

auto f = [](int x){ return x+1; };
9️⃣ Lambda 做状态机(闭包)

比如计数器:

auto counter = [i = 0]() mutable {
    return ++i;
};

counter(); //1
counter(); //2
counter(); //3
多线程共享状态:

auto sum = [total = std::atomic<int>(0)](int x) mutable {
    total += x;
};
这就是函数式闭包的力量。

🔟 Lambda 捕获移动对象

最重要的例子:线程池任务提交

pool.push([task=std::move(task)]() mutable {
    task();
});
⭐ 高级技巧加一条:模板 Lambda(C++20)

auto add = []<typename T>(T a, T b){
    return a + b;
};
⚙ 底层实现补充

Lambda 本质上:

编译器生成 struct + operator()

带捕获:

int x = 10;
auto f = [x]{ return x+1; };
等价于

struct _lambda {
    int x;
    int operator()() const { return x+1; }
};
🚩 性能注意点

写法性能
auto lambda🟢 最快
template lambda🟢 最快
std::function🔴 可能动态分配,慢
bind🔴 更慢/不推荐

🧨 STL 中的高阶组合

std::sort(v.begin(), v.end(),
    [](auto &a, auto &b){
        return a.score > b.score;
    }
);
过滤:

auto it = std::remove_if(v.begin(), v.end(),
    [&](auto &n){ return n < 0; });
 

https://2048ai.net/681c858fa5baf817cf49925a.html?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7Eactivity-2-136151698-blog-157142162.235%5Ev43%5Epc_blog_bottom_relevance_base7&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7Eactivity-2-136151698-blog-157142162.235%5Ev43%5Epc_blog_bottom_relevance_base7&utm_relevant_index=3

【ARMv8 异常模型入门及渐进7 - GIC及安全中断介绍】 GIC-v3中,引入了支持2种安全状态(secure state),也就是对于中断,根据secure状态,分为安全中断和非安全中断。当然也可以只支持一种安全状态。这里的2种安全状态和1种安全状态,主要是影响中断分组,所使用IRQ和FIQ管脚的映射,以及gic中的寄存器访问。 阅读详情

相关推荐

Jetson Nano(1)——笔记本电脑控制

笔记本电脑控制Jetson Nano没有显示屏如何控制Jetson Nano一、使用ssh客户端连接到Jetson Nano的命令端1.将电脑的网线口和jetson nano的网线口通过网线连接2.在控制面版中打开“更改配适器设置”3.查找jetson nano的ip地址4.利用putty链接二、远程桌面配置 没有显示屏如何控制Jetson Nano Jetson Nano相当于一个微型电脑,能快...

weixin_43619070的博客 1万+

C#中的Lambda表达式

     “Lambda 表达式”基于数学中的λ演算得名,直接对应于其中的lambda抽象,是一个匿名函数,就是没有函数名的函数。C#的Lambda 表达式都使用 Lambda 运算符=&gt;,该运算符读为“goes to”。语法如下:形参列表=&gt;函数体注意:函数体大于一条语句的要用用大括号括起来。=&gt; 运算符具有与赋值运算符 (=) 相同的优先级,并且是右结合运算符。在 is 或 ...

刘彬的编程技术博客 786

PSIM+PIL+CCS三剑客:手把手教你搞定DSP28335的软硬件联合调试

本文详细介绍了如何利用PSIM、PIL与CCS三款工具,实现DSP28335的软硬件联合调试。通过搭建兼容环境、从PSIM仿真生成PIL代码,再到实战联合调试与问题诊断,手把手指导开发者构建从虚拟模型到实际硬件的完整验证闭环,有效提升电力电子与电机驱动等领域的开发效率与可靠性。

weixin_29183637的博客 185

Lambda表达式

文章目录1.什么是Lambda表达式2.为什么使用Lambda表达式3.Lambda表达式语法4.函数式接口4.1 什么是函数式接口4.2 自定义函数式接口4.3 Java内置函数式接口5.方法引用6.构造器引用7.数组引用8.Lambda表达式的作用域8.1 访问局部变量8.2 访问局部引用,静态变量,实例变量8.3 Lambda表达式访问局部变量作限制的原因9.Lambda表达式的优缺点 1.什么是Lambda表达式 Lambda表达式,也可称为闭包。类似于JavaScript中的闭包,它是推动Java

小赵的呢 7084

思科模拟器Cisco Packet Tracer交换机的管理配置

一、交换机的管理方式:带内管理和带外管理 通过交换机的 Console 端口管理交换机属于带外管理;这种管理方式不占用交换机的网络端口,第一次配置交换机必须利用 Console 端口进行配置。 通过 Telnet、拨号等方式属于带内管理。 二、控制台配置思科交换机 1.新建拓扑图 新建拓扑,选择console线连接交换机和PC,一端接交换机的console口,一端接PC的RS 232 口(...

qq_37992321的博客 2万+

手把手教你修改miniwiggler配置信息,解决UDE连接问题(附FT_PROG工具下载)

本文详细介绍了如何使用FT_PROG工具修改miniwiggler配置信息,解决UDE连接问题。通过分析FT2232芯片的EEPROM结构,提供从驱动安装到配置烧写的完整流程,帮助开发者实现无缝连接英飞凌TriBoard开发板。文章还包含常见错误解决方案和高级批量配置技巧。

weixin_30919429的博客 373

Lambda表达式详解

本篇详解了Lambda表达式的用法及六种语法格式。

一个真ikun 2万+

告别盲调!用Synopsys VIP搭建PCIe 5.0验证环境,手把手搞定链路训练与均衡调试

本文详细介绍了基于Synopsys VIP搭建PCIe 5.0验证环境的实战指南,重点解析了链路训练(LTSSM)与均衡调试的关键技术。通过配置VIP组件、设计验证平台架构及实战调试技巧,帮助工程师高效解决PCIe 5.0验证中的常见问题,提升芯片验证效率与可靠性。

weixin_28700411的博客 455

深入浅出 C++ Lambda表达式:语法、特点和应用

Lambda表达式是一种在被调用的位置或作为参数传递给函数的位置定义匿名函数对象(闭包)的简便方法。是捕获列表,用于指定 Lambda表达式可以访问的外部变量,以及是按值还是按引用的方式访问。捕获列表可以为空,表示不访问任何外部变量,也可以使用默认捕获模式或来表示按引用或按值捕获所有外部变量,还可以混合使用具体的变量名和默认捕获模式来指定不同的捕获方式。是参数列表,用于表示 Lambda表达式的参数,可以为空,表示没有参数,也可以和普通函数一样指定参数的类型和名称,还可以在 c++14 中使用auto。

宁子希的博客 9万+

C++/WinRT入门指南:现代Windows原生开发的核心技术

Windows运行时(WinRT)是微软为现代Windows应用开发设计的一套跨语言API框架,它基于COM技术原理构建,提供了统一的二进制接口标准。这项技术的核心价值在于让开发者能够以原生性能调用系统级功能,同时保持跨语言兼容性。在工程实践中,C++/WinRT作为官方推荐的C++语言投影,通过标准C++语法封装WinRT API,显著降低了开发复杂度。特别是在异步编程场景中,结合C++20协程特性,能够大幅提升代码可读性和维护性。对于需要高性能图形处理、系统集成或跨平台兼容的桌面应用开发,掌握C++/W

weixin_33910191的博客 1195

学Simulink——基于Simulink的Buck-Boost变换器双闭环PI+抗饱和设计建模示例

本文详细介绍了基于Simulink的非反相Buck-Boost变换器双闭环控制设计方法。针对Buck-Boost变换器特有的右半平面零点(RHPZ)和控制挑战,提出了电压-电流双闭环PI控制架构,并集成抗积分饱和机制。通过Simulink建模,实现了主电路、电流内环PI、电压外环PI、PWM及占空比限幅等模块的搭建,验证了在输入电压跌落(20V→10V)和负载突变(2A→4A)等场景下的稳定性能。仿真结果表明,输出电压波动小于0.35V,恢复时间快于1ms,电感电流有效限幅。文章还讨论了工程实践要点和扩展方

xiaoheshang_123的博客 318

C# Lambda表达式

C#,Lambda表达式

鲤籽鲲的博客 1万+

提取游戏音频文件.bnk

bnk其实是一种对音频的加密方式,一个.bnk文件中通常包含了多个语音文件,一般可以使用Wwise-Unpacker来解码.bnk格式文件该工具命名没有规律,需要手动整理文件名。市面上很多的游戏都把音频文件打成.bnk文件(比如永劫无间),用这种方式可以将你想要的游戏的音频都提取出来,本文内容仅供自己娱乐。

类人_猿的博客 8742

Lambda表达式和Lambda表达式树

 •Lambda表达式概念 –“Lambda 表达式”是一个匿名函数,它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型。 –Lambda表达式是对.NET2.0中匿名方法在语法形式上的进一步改进 var inString = list.FindAll(delegate(string s) { return s.Indexof("YJingLee") >= 0; }); –使

sytWeibo的专栏 5802

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

五、Lambda表达式

的便捷语法,自C++11引入后极大简化了代码编写,尤其是在需要传递短小函数逻辑的场景(如STL算法、回调函数等)

LFFF_21的博客 758

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

C#中的Lambda表达式与Lambda语句

Lambda表达式是作为对象处理的代码块,可作为参数传递给方法,也可通过方法调用返回,是与匿名方法类似的内联表达式,但更加灵活。

arenascat的博客 1773

lambda表达式

lambda表达式的形式 [捕获参数列表](函数参数列表) mutable throw(类型)->返回值类型 {函数语句};

liugan528的博客 1067

C# Lambda表达式详解,及Lambda表达式树的创建

  最近由于项目需要,刚刚学完了Action委托和Func<T>委托,发现学完了委托就必须学习lambda表达式,委托和Lambda表达式联合起来,才能充分的体现委托的便利、才能使代码更加简介、优雅。 Lambda表达式 "Lambda表达式"是一个匿名函数,是一种高效的类似于函数式编程的表达式,Lambda简化了开发中需要编写的代码量。它可以包含表达式和语句,并且...

aa124413278的博客 913
上一篇: unique_lock<mutex> uLock 的用法
下一篇: 大小端总结
怕什么真理无穷
博客等级 码龄10年 415粉丝 195原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值