最近DeepSeek比较火,就用它来温习一下lambda表达式
问:帮我写一个C++的lambda表达式例子
DS: 当然!下面是一个简单的C++ lambda表达式的例子:
#include <iostream> #include <vector> #include <algorithm> int main() { // 创建一个整数向量 std::vector<int> numbers = {1, 2, 3, 4, 5}; // 使用lambda表达式打印每个元素 std::for_each(numbers.begin(), numbers.end(), [](int n) { std::cout << n << " "; }); std::cout << std::endl; // 使用lambda表达式计算元素的平方并存储到另一个向量中 std::vector<int> squares; std::transform(numbers.begin(), numbers.end(), std::back_inserter(squares), [](int n) { return n * n; }); // 打印平方后的结果 std::for_each(squares.begin(), squares.end(), [](int n) { std::cout << n << " "; }); std::cout << std::endl; return 0; }
DS: 代码解释:
-
第一个lambda表达式:
[](int n) { std::cout << n << " "; }
这个lambda表达式接受一个整数
n
作为参数,并打印它。它被传递给std::for_each
,用于遍历numbers
向量并打印每个元素。 -
第二个lambda表达式:
[](int n) { return n * n; }
这个lambda表达式接受一个整数
n
作为参数,并返回它的平方。它被传递给std::transform
,用于将numbers
向量中的每个元素平方,并将结果存储到squares
向量中。
输出:
1 2 3 4 5 1 4 9 16 25
这个例子展示了如何使用lambda表达式来简化代码,尤其是在需要传递简单函数对象的情况下。
问:有没有更复杂的lambda表达式例子
DS: 当然!下面是一个更复杂的C++ lambda表达式例子,展示了如何捕获外部变量、使用mutable
关键字、以及返回一个lambda表达式。
#include <iostream> #include <functional> int main() { int x = 10; int y = 5; // 一个复杂的lambda表达式,捕获x和y,并返回一个lambda表达式 auto complexLambda = [x, &y](int z) mutable -> std::function<int(int)> { // 修改捕获的x(因为是mutable) x += z; // 修改捕获的y(因为是引用) y += z; // 返回一个新的lambda表达式 return [x, y](int w) mutable { return x + y + w; }; }; // 调用complexLambda,传入z = 3 auto innerLambda = complexLambda(3); // 调用innerLambda,传入w = 2 int result = innerLambda(2); // 输出结果 std::cout << "Result: " << result << std::endl; // 输出: Result: 20 std::cout << "x after complexLambda: " << x << std::endl; // 输出: x after complexLambda: 10 std::cout << "y after complexLambda: " << y << std::endl; // 输出: y after complexLambda: 8 return 0; }
DS: 代码解析:
-
捕获外部变量:
-
[x, &y]
:x
是按值捕获,y
是按引用捕获。 -
按值捕获的变量在lambda内部是只读的,除非使用
mutable
关键字。 -
按引用捕获的变量可以直接修改。
-
-
mutable
关键字:-
使用
mutable
后,按值捕获的变量(如x
)可以在lambda内部修改。 -
注意:这种修改不会影响外部的原始变量。
-
-
返回一个lambda表达式:
-
complexLambda
返回一个新的lambda表达式,这个新的lambda表达式捕获了x
和y
的值。 -
返回的lambda表达式接受一个参数
w
,并返回x + y + w
。
-
-
调用过程:
-
complexLambda(3)
:传入z = 3
,修改x
和y
的值,并返回一个新的lambda表达式。 -
innerLambda(2)
:调用返回的lambda表达式,传入w = 2
,计算x + y + w
。
-
-
输出结果:
-
Result: 20
:x
(修改后为13) +y
(修改后为8) +w
(2) = 20。 -
外部的
x
仍然是10,因为它是按值捕获的。 -
外部的
y
被修改为8,因为它是按引用捕获的。
-
更复杂的场景:
如果你想要更复杂的lambda表达式,可以结合以下特性:
-
泛型lambda(C++14及以上):
auto genericLambda = [](auto a, auto b) { return a + b; }; std::cout << genericLambda(3, 4.5) << std::endl; // 输出: 7.5
-
递归lambda:
使用std::function
来实现递归调用:std::function<int(int)> factorial = [&factorial](int n) -> int { return (n <= 1) ? 1 : n * factorial(n - 1); }; std::cout << factorial(5) << std::endl; // 输出: 12
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端