C++探索:一句话说清楚什么是Lambda表达式

一、 什么是Lambda表达式

        Lambda表达式,也称为匿名函数,它的作用,它允许你在需要函数的地方内联地定义函数,而 无需单独命名函数,即可以充当普通函数使用。

什么叫做“内联”:简单解释,就是可以减少函数调用开销,适用于小型函数。

而什么是内联函数?可以看我的另一篇文章:

https://blog.ZEEKLOG.net/lonelymonk/article/details/158154585?sharetype=blogdetail&sharerId=158154585&sharerefer=PC&sharesource=lonelymonk&spm=1011.2480.3001.8118

        先简单地了解Lambda表达式的基本形式以及其各部分的含义

[capture clause](parameters) -> return_type { // 函数体 // 可以使用捕获列表中的变量 return expression; // 可选的返回语句 }

        1.捕获列表 【capture clause】

        用于捕获Lambda外部的变量,可以在表达式内部访问这些被捕获的变量;捕获列表可以为空,也可以包含变量列表【value1,value2,value3】

        2.参数列表(parameters)

        与普通函数的参数列表类似,可以为空或包含参数列表 (param1,

param2, ...) 。

        3.返回类型(return_type)

        用于指定Lambda表达式可以显式地指定其返回类型,同时,也可以通过“auto”关键字,来自动推断返回类型。如果表达式只有一条返回语句,可以省略返回类型。

        4.函数体(body)

        :包含需要执行的代码。

二、应用范围

        在C++ 中,Lambda表达式主要有如下运用

        1.直接替代函数的作用

         Lambda 表达式最简单的案例是在需要一个小型函数或临时函数时直接使用它。以下以计算两数之和的案例来解释:        常规函数:

#include <iostream> using namespace std; int get_sum(int a, int b) { return a+b;//构建函数,实现两数之和相加 } int main() { //初始化变量 int a = 0; int b = 0; int sum = 0; cout<<"请输入两个值:"<<endl; cin >> a ; cin >> b; sum = get_sum(a,b);//调用函数 cout<<"两个数之和是:"<< sum << endl; return 0; } 

        使用Lambda表达式:

#include <iostream> using namespace std; int main() { //初始化变量 int a = 0; int b = 0; cout<<"请输入两个值:"<<endl; cin >> a ; cin >> b; auto add =[](int c,int d){ return c+d;//Lambda表达式 }; int sum = add(a , b); cout<<"两个数之和是:"<< sum << endl; return 0; } 

        2.在回调函数中使用

        常规使用:

#include <iostream> using namespace std; bool compare(int a ,int b){ return a > b;//返回a是否大于b的bool类型 } int get_max(int a, int b, bool(*point)(int ,int)){ if (point(a,b)){ return a; } else{ return b; } } int main() { //初始化变量 int a = 0; int b = 0; cout<<"请输入两个值:"<<endl; cin >> a ; cin >> b; int max = get_max(a,b,compare);//变量1,变量2, 函数指针 cout<<"两个数中较大的一个数是:"<< max << endl; return 0; } 

        使用Lambda表达式

#include <iostream> using namespace std; int get_max(int a, int b, bool(*point)(int ,int)){ if (point(a,b)){ return a; } else{ return b; } } int main() { //初始化变量 int a = 0; int b = 0; cout<<"请输入两个值:"<<endl; cin >> a ; cin >> b; int max = get_max(a,b,[](int a ,int b)->bool{ return a > b;});//变量1,变量2,Lambda表达式,直接传入执行数值比较的函数,而非函数指针 cout<<"两个数中较大的一个数是:"<< max << endl; return 0; } 

        3.带参数捕获的Lambda表达式

                (1)按值部分参数捕获

                   捕获到表达式中的变量,不需要手动传入参数,类似于复制粘贴,但是并不可以修改值,可读不可写。

#include <iostream> using namespace std; int main() { //初始化变量 int a = 10; int b = 20; int c = 30; auto add =[a,b]()->int{ return a+b; }; int sum = add(); cout<<"两数字之和:"<< sum << endl; return 0; } 

        (2)按值全局捕获

                括号中的“=”代表从表达式外获取全部变量值,传入表达式中;同样不可以修改值的大小,可读不可写

#include <iostream> using namespace std; int main() { //初始化变量 int a = 10; int b = 20; int c = 30; auto add =[=]()->int{ return a+b+c; }; int sum = add(); cout<<"数字之和:"<< sum << endl; return 0; } 

        (3)引用全局捕获

        括号中通过 “&”来引用的捕获外部变量的地址,类似于指针传入参数,因此可以修改参数的值,可读可写

#include <iostream> using namespace std; int main() { //初始化变量 int a = 10; int b = 20; int c = 30; auto add =[&]()->int{ a = 20; return a+b+c; }; int sum = add(); cout<<"数字之和:"<< sum << endl; return 0; } 

Read more

【数据结构】链表还搞不懂?一文彻底拿下单链表与双链表的所有操作

【数据结构】链表还搞不懂?一文彻底拿下单链表与双链表的所有操作

🔭 个人主页:散峰而望 《C语言:从基础到进阶》《编程工具的下载和使用》《C语言刷题》《算法竞赛从入门到获奖》《人工智能》《AI Agent》 愿为出海月,不做归山云 🎬博主简介 【数据结构】链表还搞不懂?一文彻底拿下单链表与双链表的所有操作 * 前言 * 1. 链表 * 2. 链表的类型 * 2.1 单向或双向 * 2.2 带头或不带头 * 2.3 循环或不循环 * 3. 单链表 * 3.1 定义单链表结构 * 3.2 单链表的打印 * 3.3 插入节点 * 3.3.1 尾插 * 3.3.2 头插 * 3.

By Ne0inhk
Flutter 三方库 shelf_web_socket 的鸿蒙化适配指南 - 实现具备高性能全双工长连接与协议协商能力的端侧服务端架构、支持分布式实时信令与多端协同实战

Flutter 三方库 shelf_web_socket 的鸿蒙化适配指南 - 实现具备高性能全双工长连接与协议协商能力的端侧服务端架构、支持分布式实时信令与多端协同实战

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 shelf_web_socket 的鸿蒙化适配指南 - 实现具备高性能全双工长连接与协议协商能力的端侧服务端架构、支持分布式实时信令与多端协同实战 前言 在进行 Flutter for OpenHarmony 开发时,当我们的鸿蒙应用需要充当“控制中心”角色(如控制智能家居、开启本地调试服务或实现 P2P 实时对抗脚本时),如何在端侧直接拉起一个支持 WebSocket 协议的高性能微服务端?shelf_web_socket 是针对 shelf 后端框架封装的一款官方级 WebSocket 处理器。本文将探讨如何在鸿蒙端构建极致、透明的长连接交互引擎。 一、原直观解析 / 概念介绍 1.1 基础原理 该库本质上是一个 shelf 处理函数(Handler)

By Ne0inhk
《算法闯关指南:动态规划算法--斐波拉契数列模型》--01.第N个泰波拉契数,02.三步问题

《算法闯关指南:动态规划算法--斐波拉契数列模型》--01.第N个泰波拉契数,02.三步问题

🔥草莓熊Lotso:个人主页 ❄️个人专栏: 《C++知识分享》《Linux 入门到实践:零基础也能懂》 ✨生活是默默的坚持,毅力是永久的享受! 🎬 博主简介: 文章目录 * 前言: * 01.第N个泰波拉契数 * 解法(动态规划): * 算法流程: * C++算法代码: * 算法总结&&笔记展示: * 02.三步问题 * 解法(动态规划): * 算法思路: * C++算法代码: * 算法总结&&笔记展示: * 结尾: 前言: 聚焦算法题实战,系统讲解三大核心板块:优选算法:剖析动态规划、二分法等高效策略,学会寻找“最优解”。 递归与回溯:掌握问题分解与状态回退,攻克组合、排列等难题。 贪心算法:理解“

By Ne0inhk