【C/C++】Lambda 用法

Lambda 用法

1

cpp 复制代码
auto dfs = [&](auto&& dfs, int i, int j) -> int {}

这行代码定义了一个匿名的lambda表达式(也称为闭包),并将其赋值给名为dfs的变量。这个lambda表达式使用了递归和引用捕获自身的技巧,来实现深度优先搜索(Depth First Search, DFS)或其他递归算法。下面是对这行代码的详细解释:

  • auto dfs = [&](...) -> int { ... };:这部分定义了一个lambda表达式,并将其赋值给dfs变量。auto关键字用于自动推导lambda表达式的类型。[&]是捕获列表,表示以引用的方式捕获所有外部变量(包括这个lambda表达式本身,如果它在递归调用中需要)。-> int指明了这个lambda表达式的返回类型是int。

【重点】

  • [&](auto&& dfs, int i, int j):这是lambda表达式的参数列表。它接受三个参数:
    • auto&& dfs:这是一个通用引用(forwarding reference),能够完美地转发其参数。在这个上下文中,它用于递归调用自身时保持类型安全。由于dfs变量本身就是这个lambda表达式的一个实例,这里通过参数传递自身实现递归调用,同时避免了在捕获列表中捕获自身导致的潜在问题(如复制或移动语义的复杂性)。
    • int i和int j:这两个参数通常用于表示在某种结构(如二维数组或图)中的位置或坐标。

  • { ... }:这是lambda表达式的主体,其中应该包含实现DFS或其他递归算法的逻辑。

这种写法利用了C++11及以后版本中lambda表达式的功能,特别是完美转发和自身引用的特性,使得递归lambda表达式成为可能。它允许开发者在lambda表达式内部实现递归逻辑,而不需要定义一个单独的函数或方法。这种技巧在解决某些问题时非常有用,尤其是在需要局部定义递归算法且不希望污染全局命名空间的情况下。

然而,需要注意的是,虽然这种写法很强大,但也可能使代码难以理解和维护,特别是对于那些不熟悉lambda表达式和递归技巧的读者。因此,在使用这种技术时,应该权衡其带来的便利性和代码的可读性。

相关推荐
坤坤子吖2 小时前
Linux网络编程:TCP服务器的多进程与多线程实现
linux·服务器·开发语言·网络·c++·笔记·学习
一晌小贪欢2 小时前
Python基础:第 09 篇 · while 循环:重复直到不满足
开发语言·c++·python·数据可视化·面向对象·python办公
xiaoye-duck3 小时前
《C++ 项目:手写大模型接入 SDK》LLMManager架构设计与实现
开发语言·网络·c++·语言模型
一条大祥脚3 小时前
CuTe 与 CuTe DSL:从 C++ 模板元编程到 Python DSL 的 GPU 编程演进
开发语言·c++·python·cutlass·cute·cute dsl
·present·3 小时前
CSAPP(lecture 13_02 Linking)
c语言·c++
旖旎夜光4 小时前
【C++ 基础入门】C++ 多态(上):虚函数、重写、override/final 与抽象类
开发语言·c++·笔记·学习
青少儿编程课堂6 小时前
蓝桥杯青少组图形化 STEMA 省考(报名倒计时·11/22开考)+ 全国青少年信息素养大赛 2026—2027赛季 + 电子学会图形化考级:校园华容道大闯关
c++·python·算法·bfs·信息学竞赛
白杨尚青6 小时前
C++进阶篇(五):红黑树——四条规则、三种插入情况与旋转变色
开发语言·数据结构·c++·stl·红黑树·平衡二叉树
旖旎夜光7 小时前
【C++ 基础入门】C++ 继承(上):概念、切片、隐藏、默认成员函数与友元
c++·笔记·学习
apcipot_rain8 小时前
C++转Java日记(05)
java·开发语言·c++