【现代C++】Lambda表达式

在这里插入图片描述

在现代C++中,Lambda表达式提供了定义匿名函数对象的能力,这在很多场合,如STL算法、线程构造函数、事件处理等,都非常有用。Lambda表达式使得函数定义更加灵活和简洁。

1. 基本语法

Lambda表达式的基本形式包括一个捕获列表、参数列表、返回类型(可选)和函数体。

#include <iostream>

void basicLambda() {
    auto lambda = []() {
        std::cout << "Hello, Lambda!" << std::endl;
    };

    lambda();  // 调用Lambda表达式
}

2. 捕获列表

捕获列表定义了Lambda表达式可以访问的外部变量,以及访问方式(值或引用)。

#include <iostream>

void captureLambda() {
    int x = 10;
    auto captureByValue = [x]() {
        std::cout << "Capture by value: " << x << std::endl;
    };
    auto captureByReference = [&x]() {
        std::cout << "Capture by reference: " << x << std::endl;
    };

    x = 20;
    captureByValue();      // 输出10,因为是值捕获
    captureByReference();  // 输出20,因为是引用捕获
}

3. 带参数的Lambda

Lambda表达式可以像普通函数一样接受参数。

#include <iostream>

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

    std::cout << "3 + 4 = " << add(3, 4) << std::endl;
}

4. 指定返回类型

对于复杂的Lambda表达式,可能需要显式指定返回类型。

#include <iostream>

void returnTypeLambda() {
    auto divide = [](double a, double b) -> double {
        if(b == 0) return 0;
        return a / b;
    };

    std::cout << "6 / 2 = " << divide(6, 2) << std::endl;
}

5. Lambda在STL算法中的应用

Lambda表达式常用于STL算法中,特别是那些需要回调函数的算法。

#include <algorithm>
#include <vector>
#include <iostream>

void stlLambda() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    std::for_each(vec.begin(), vec.end(), [](int x) {
        std::cout << x << " ";
    });
    // 输出: 1 2 3 4 5
}

6. Lambda捕获成员变量

在类的成员函数中,可以使用Lambda捕获成员变量。

#include <iostream>
#include <vector>
#include <algorithm>

class LambdaInClass {
private:
    std::vector<int> vec = {1, 2, 3, 4, 5};

public:
    void print() {
        std::for_each(vec.begin(), vec.end(), [this](int value) {
            std::cout << value + this->offset << " ";
        });
        // 输出: 2 3 4 5 6
    }

private:
    int offset = 1;
};

void lambdaInClass() {
    LambdaInClass obj;
    obj.print();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/510459.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【微信小程序】流量主-激励视频(激励广告)下发策略,每天三次免费体验,然后再次点击触发激励视频,当日不再触发。

如题&#xff1a; 允许用户有三次体验效果&#xff0c;然后弹出激励视频弹窗&#xff0c;之后当日不再弹出。 体验小程序&#xff1a; /*** 判断当前项目当天是否点击超过3次&#xff0c;触发广告效果。* 若&#xff0c;当天低于三次&#xff0c;则新增&#xff0c;若高于…

未来电商怎么走,是腾讯视频号,还是抖音小店?你更看好谁?

大家好&#xff0c;我是电商花花。 现在想做一些项目&#xff0c;做些生意基本上就离不开电商&#xff0c;网络这么发达&#xff0c;直播短视频这么火&#xff0c;未来的发展依然是直播电商。 现在线下很多实体店都被电商所冲击&#xff0c;而且不少实体店也都在网上开店卖货…

Spring 整合 Log4j2日志框架

1. Log4j2日志概述 在项目开发中&#xff0c;日志十分的重要&#xff0c;不管是记录运行情况还是定位线上问题&#xff0c;都离不开对日志的分析。日志记录了系统行为的时间、地点、状态等相关信息&#xff0c;能够帮助我们了解并监控系统状态&#xff0c;在发生错误或者接近某…

【面试HOT200】数组篇

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招面试coding部分的&#xff0c;整理期间苛求每个算法题目&#xff0c;平衡可读性与代码性能&#xff08;leetcode运行复杂度均打败80%以上&#xff09;。 &#x1f970;来源&#xff1a;材料主要源于…

linux删除 buff/cache缓存

1.查看当前内存占用 free -h如图&#xff0c;缓存占用了将近9G&#xff0c;接下来进行清理 释放页缓存 echo 1 > /proc/sys/vm/drop_caches释放dentries和inodes echo 2 > /proc/sys/vm/drop_caches释放所有缓存 echo 3 > /proc/sys/vm/drop_caches再次查看&#…

MQ

目录 MQ优点 异步 解耦 削峰填谷 mq的缺点 MQ常见的几种模式 Kafka、ActiveMQ、RabbitMQ、RocketMQ 区别 MQ优点 mq是一种常见的中间件&#xff0c;在项目中经常用到&#xff0c;它具有异步、解耦、削峰填谷的作用。 异步 比如下单流程&#xff0c;A服务—>B服务&a…

为什么称FreeRTOS为轻量级OS,和Linux相比,有哪些具体的区别?

要理解它们&#xff0c;就要看这些最终的概念是怎么来的&#xff0c;其实这些都是在不同资源&#xff08;硬件&#xff09;上处理不同场景问题所得的结果。 FreeRTOS一般跑在几十Mhz&#xff0c;几十KB的硬件上&#xff0c;比如Cortex-M系列MCU上&#xff0c;资源很有限&#…

论文精读--GPT4

现有的所有模型都无法做到在线学习&#xff0c;能力有限&#xff0c;而让大模型拥有一个tools工具库&#xff0c;则可以使大模型变成一个交互式的工具去协调调用API完成任务&#xff0c;同时GPT4还联网了&#xff0c;可以不断地更新自己的知识库 多模态模型&#xff0c;接受文…

面经分享(Flask,轻量级Web框架)

1. Flask的核心特点 a. 轻量级&#xff1a;核心简洁&#xff0c;只提供了基本的功能&#xff0c;其他高级功能可以通过插件或扩展来添加。 b. 灵活性&#xff1a;允许开发者选择适合自己项目的组件和工具&#xff0c;没有强制的项目结构和设计模式。 c. 易于扩展&#xff1a;提…

JVM 内存溢出排查

说明&#xff1a;记录一次JVM内存溢出的排查过程&#xff1b; 场景 项目开发完成后&#xff0c;首次提交到测试环境。测试、产品同事反馈页面先是操作响应慢&#xff0c;抛出超时异常&#xff0c;最后直接无法使用。查看日志后得知是内存溢出。 重启服务后&#xff0c;我对前…

接口测试实战教程(加密解密攻防)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、对称加密 对称加密算法是共享密钥加密算法&#xff0c;在加…

RuntimeError: Error compiling objects for extension虚拟环境和系统环境——添加、删除、修改环境变量

前言&#xff1a;因为一个报错RuntimeError: Error compiling objects for extension 没有配置cl.exe环境变量&#xff0c;我的应用场景是需要搞定虚拟环境变量配置 RuntimeError: Error compiling objects for extension手把手带你解决&#xff08;超详细&#xff09;-CSDN博…

Mybatis 之 useGeneratedKeys

数据库中主键基本都设置为自增&#xff0c;当我们要插入一条数据想要获取这条数据的 Id 时&#xff0c;就可使用 Mybatis 中的 useGeneratedKeys 属性。 背景 这里以 苍穹外卖 中的 新增菜品 功能为例&#xff0c;有 菜品表(dish table)和 口味表(dish_flavor table)&#xf…

HTML标签之有序列表,无序列表,自定义链表

无序列表 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width, i…

从零开始学数据分析之数据分析概述

当今世界对信息技术的依赖程度在不断加深&#xff0c;每天都会有大量的数据产生&#xff0c;我们经常会感到数据越来越多&#xff0c;但是要从中发现有价值的信息却越来越难。 这里所说的信息&#xff0c;可以理解为对数据集处理之后的结果&#xff0c;是从数据集中提炼出的可用…

redis 高可用与 持久化

目录 一 redis 高可用 &#xff08;一&#xff09;redis高可用技术 1&#xff0c;持久化 2&#xff0c;主从复制 3&#xff0c;哨兵 4&#xff0c;Cluster集群 二 redis 持久化 &#xff08;一&#xff09;持久化相关概念介绍 1&#xff0c;持久化的功能 2&…

Pygame基础9-射击

简介 玩家用鼠标控制飞机&#xff08;白色方块&#xff09;移动&#xff0c;按下鼠标后&#xff0c;玩家所在位置出现子弹&#xff0c;子弹匀速向右飞行。 代码 没有什么新的东西&#xff0c;使用两个精灵类表示玩家和子弹。 有一个细节需要注意&#xff0c;当子弹飞出屏幕…

实战 | YOLOv8自定义数据集训练实现手势识别 (标注+训练+预测 保姆级教程--含数据集)

导 读 本文将手把手教你用YoloV8训练自己的数据集并实现手势识别。 安装环境 【1】安装torch, torchvision对应版本,这里先下载好,直接安装 pip install torch-1.13.1+cu116-cp38-cp38-win_amd64.whlpip install torchvision-0.14.1+cu116-cp38-cp38-win_amd64.whl 安装好…

剑指offer打卡 JZ7 重建二叉树

在牛客网刷的&#xff0c;还是跟leetcode一样非acm模式&#xff0c;由于急着暑期实习题量不固定&#xff0c;八股算法轮刷 打卡内容偏个人笔记&#xff0c;本人水平一般(代码随想录稀里糊涂刷了一遍)&#xff0c;从小白开始分析(甚至会分析语法)&#xff0c;尽量一题多解深入探…

VSCode好用插件

由于现在还是使用vue2&#xff0c;所以本文只记录vue2开发中好用的插件。 美化类插件不介绍了&#xff0c;那些貌似对生产力起不到什么大的帮助&#xff0c;纯粹的“唯心主义”罢了&#xff0c;但是如果你有兴趣的话可以查看上一篇博客&#xff1a;VSCode美化 1. vuter 简介&…