Lambda语法解析

news2024/9/21 0:40:13

Lambda语法解析

  • 一.Lambda语法
    • 1.Lambda表达式基本形式:
    • 2.capture list(捕获列表)
    • 3.捕获列表程序案例
  • 二.Lambda应用
    • 1.使用 lambda 表达式对数组排序,并将排序后的元素存储到新数组中:
    • 2.使用 lambda 表达式计算两个矩阵的和:
    • 3.使用 lambda 表达式实现自定义的 sort 函数,可以按照指定的排序规则排序:
    • 4.使用 lambda 表达式实现一个类似于 filter 函数的功能,可以根据指定条件筛选出符合条件的元素:

一.Lambda语法

Lambda表达式是C++11标准引入的一种新特性,它是一种匿名函数,可以在需要时创建临时的函数对象,从而方便地进行函数式编程。

1.Lambda表达式基本形式:

[capture list](parameter list) -> return type { function body }

其中,capture list用于捕获变量,parameter list用于定义参数,return type用于定义返回值类型(可以省略),function body是函数体。

2.capture list(捕获列表)

在C++的lambda表达式中,捕获列表(capture list)用于控制lambda表达式的访问权限,也就是指定lambda表达式中的外部变量如何被访问。捕获列表由方括号[]括起来,其中包含一个逗号分隔的变量列表。

选项含义
[]不捕获任何变量,lambda表达式只能使用本地变量。
[&]按引用捕获所有外部变量,lambda表达式可以修改捕获的变量,且修改后的值将影响到外部作用域中的变量。
[=]按值捕获所有外部变量,lambda表达式不能修改捕获的变量,修改只会影响到lambda表达式内部的变量。
[var]按值捕获变量var,只有变量var会被捕获。
[&var]按引用捕获变量var,只有变量var会被捕获,且lambda表达式可以修改变量var的值。

3.捕获列表程序案例

#include <iostream>

int main() {
    int x = 10;
    int y = 20;

    // []:不捕获任何变量
    auto f1 = []() {
        std::cout << "Hello, world!" << std::endl;
    };
    f1();

    // [&]:按引用捕获所有外部变量
    auto f2 = [&]() {
        x++;
        y++;
        std::cout << "x = " << x << ", y = " << y << std::endl;
    };
    f2();
    std::cout << "x = " << x << ", y = " << y << std::endl;

    // [=]:按值捕获所有外部变量
    auto f3 = [=]() {
        std::cout << "x = " << x << ", y = " << y << std::endl;
    };
    f3();

    // [x]:按值捕获变量x
    auto f4 = [x]() {
        std::cout << "x = " << x << std::endl;
    };
    f4();

    // [&y]:按引用捕获变量y
    auto f5 = [&y]() {
        y++;
        std::cout << "y = " << y << std::endl;
    };
    f5();
    std::cout << "y = " << y << std::endl;

    return 0;
}

在这里插入图片描述

二.Lambda应用

1.使用 lambda 表达式对数组排序,并将排序后的元素存储到新数组中:

#include <iostream>
#include <algorithm>

using namespace std;

void print(int arr[],int n) {
    for (int i = 0; i < n; i++) {
        cout << arr[i] << " ";
    }
    cout << endl;
}
int main() {
    int arr[] = { 3, 6, 2, 7, 1, 9, 8, 4, 5 };
    int const n = sizeof(arr) / sizeof(arr[0]);
    sort(arr, arr + n, [](int a, int b) { return a < b; });
    print(arr, n);
    
    int sorted_arr[n];
    copy(arr, arr + n, sorted_arr);
    print(arr, n);

    return 0;
}

在这里插入图片描述

2.使用 lambda 表达式计算两个矩阵的和:

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

using namespace std;

int main() {
    vector<vector<int>> matrix1{ {1, 2}, {3, 4} };
    vector<vector<int>> matrix2{ {5, 6}, {7, 8} };

    vector<vector<int>> result(matrix1.size(), vector<int>(matrix1[0].size()));

    transform(matrix1.begin(), matrix1.end(), matrix2.begin(), result.begin(),
        [](const vector<int>& row1, const vector<int>& row2) {
            vector<int> row(row1.size());
            transform(row1.begin(), row1.end(), row2.begin(), row.begin(),
                [](int element1, int element2) { return element1 + element2; });
            return row;
        });

    for (const auto& row : result) {
        for (int element : row) {
            cout << element << " ";
        }
        cout << endl;
    }

    return 0;
}

在这里插入图片描述

3.使用 lambda 表达式实现自定义的 sort 函数,可以按照指定的排序规则排序:

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

int main() {
    std::vector<std::string> words = { "apple", "banana", "pear", "orange" };

    // 按照字符串长度排序
    std::sort(words.begin(), words.end(), [](const std::string& a, const std::string& b) {
        return a.length() < b.length();
        });

    // 输出排序结果
    for (const auto& word : words) {
        std::cout << word << " ";
    }
    std::cout << std::endl;

    return 0;
}

在这里插入图片描述

4.使用 lambda 表达式实现一个类似于 filter 函数的功能,可以根据指定条件筛选出符合条件的元素:

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

int main() {
    std::vector<int> v{ 1, 2, 3, 4, 5, 6, 7, 8, 9 };

    // 使用 lambda 表达式筛选出大于 5 的元素  //back_inserter:在末尾插入元素
    auto filtered = std::vector<int>{};
    std::copy_if(v.begin(), v.end(), std::back_inserter(filtered), [](int x) { return x > 5; });

    // 输出筛选后的结果
    std::cout << "Filtered elements: ";
    for (auto i : filtered) {
        std::cout << i << " ";
    }
    std::cout << std::endl;

    return 0;
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何安装Auto-GPT

如何安装Auto-GPT 记录一下如何安装Auto-GPT 文章目录 如何安装Auto-GPT前提克隆项目进入项目目录安装所需的依赖重命名 .env.template 文件填写API_KEY创建auto-gpt.json文件运行 Auto-GPT 前提 在安装Auto-GPT之前&#xff0c;你需要具备以下条件&#xff1a; Git环境Python环…

从历史天气预报 API 看气象大数据的商业价值

引言 近年来&#xff0c;随着气象观测技术的不断提升和气象大数据的快速发展&#xff0c;越来越多的企业开始将气象数据应用于商业领域。其中&#xff0c;历史天气预报 API 作为一种可获取历史气象数据的接口&#xff0c;具有广泛的商业应用价值。 本文将从历史天气预报 API …

数字图像处理【8】频域滤波1—关于傅里叶

这一章是数字图像处理基础的最后一章。系统的介绍傅里叶级数、傅里叶变换、离散傅里叶变换&#xff0c;快速傅里叶变换&#xff0c;以及二维傅里叶变换在图像上的应用。 变换的作用 首先我们先来聊聊什么是“变换”&#xff1f;其实在第一章介绍 HSI 颜色模型的时候&#xff0…

数据库工具——mongostat

参考文档&#xff1a;mongostat​​​​​​​​​​​ mongostat提供了当前运行的mongod或者mongos实例的大概状态。mongostat有点类似Linux的vmstat&#xff0c;但mongostat提供的是mongod或者mongos实例的信息。 从MongoDB 4.4开始&#xff0c;mongostat现在与MongoDB Ser…

第五章——动态规划1

背包问题 01背包问题 有N个物品和容量是V的背包&#xff0c;每个物品有价值vi和权重&#xff08;价值&#xff09;wi属性&#xff0c;每件物品只能用一次&#xff08;要么用0次&#xff0c;要么用1次&#xff09;&#xff0c;在背包能装得下的情况下&#xff0c;挑一部分物品装…

网络原理(四):传输层协议 TCP/UDP

目录 应用层 传输层 udp 协议 端口号 报文长度&#xff08;udp 长度&#xff09; 校验和 TCP 协议 确认应答 超时重传 链接管理 滑动窗口 流量控制 拥塞控制 延时应答 捎带应答 总结 我们第一章让我们对网络有了一个初步认识&#xff0c;第二章和第三章我们通…

bounding box线性回归

#bounding box regression原理 如图所示绿色框为飞机的Ground Truth(GT)&#xff0c;红色为提取的positive anchors&#xff0c;即便红色的框被分类器识别为飞机&#xff0c;但是由于红色的框定位不准&#xff0c;这张图相当于没有正确的检测出飞机。所以我们希望采用一种方法对…

MQTT协议 详解

文章目录 一、啥是MQTT&#xff1f;1. MQTT协议特点2. 发布和订阅3. QoS&#xff08;Quality of Service levels&#xff09;QoS 0 —— 最多1次QoS 1 —— 最少1次QoS 2 —— 只有1次 二、MQTT 数据包结构1. MQTT固定头2. MQTT可变头 / Variable header3. Payload消息体 三、M…

Redis集群常用命令及说明

一、集群的特点 1、集群架构特点 &#xff08;1&#xff09;所有的redis节点彼此互联&#xff08;PING-PONG机制&#xff09;&#xff0c;内部使用二进制协议优化传输速度和带宽&#xff1b; &#xff08;2&#xff09;节点的fail是通过集群中超过半数的节点检测失效时才生效…

2023年5月广州/东莞/深圳产品经理认证NPDP招生简章

产品经理国际资格认证NPDP是新产品开发方面的认证&#xff0c;集理论、方法与实践为一体的全方位的知识体系&#xff0c;为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。 【认证机构】 产品开发与管理协会&#xff08;PDMA&#xff09;成立于1979年&#xff0c;是…

7.Shuffle详解

1.分区规则 ps."&"指的是按位与运算&#xff0c;可以强制转换为正数 ps."%",假设reduceTask的个数为3&#xff0c;则余数为0&#xff0c;1&#xff0c;2正好指代了三个分区 以上代码的含义就是对key的hash值强制取正之后&#xff0c;对reduce的个数取…

《可穿戴环形生物阻抗装置连续无袖血压监测》阅读笔记

目录 一、论文简介 二、十个问题 参考文献 一、论文简介 本文提出了一种基于环形生物阻抗传感器的连续无袖血压监测方法。该方法利用可穿戴环形生物阻抗装置实现连续无袖血压监测&#xff0c;并通过优化电极与皮肤接触点来提高信号灵敏度。实验结果表明&#xff0c;该方法可…

【动态规划】背包问题

目录 一:思路简介 二&#xff1a;0-1 背包 三&#xff1a;完全背包 四&#xff1a;多重背包 五&#xff1a;分组背包 一:思路简介 n 个物品&#xff0c;容量为V的背包 Vi 体积 Wi 价值(权重) 二&#xff1a;0-1 背包 每件物品最多只能用1次&#xff08;要么0次&…

给httprunnermanager接口自动化测试平台加点功能(一)

文章目录 一、背景1.1、部署过程略二、使用过程2.1、新增接口列2.2、实现搜索效果三、总结 一、背景 https://github.com/httprunner/HttpRunnerManager.git从github上找的接口测试平台&#xff0c;引入公司作为测试协同测试的平台&#xff0c;底层框架基于httprunner(requests…

【单目标优化算法】杂草优化算法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

这些使用工具大推荐,现在知道不晚

1.Snip Snip是一款截图软件&#xff0c;它突出的优点就是可以制作滚动截图。 例如&#xff1a;对整个网页进行截图&#xff0c;使用Snip即可轻松获取&#xff0c;无需处理水印。 2.Sleep Cycle 快节奏、高压力的生活导致我们越来越晚睡觉&#xff0c;睡眠质量越来越差。 想提…

Python学习9:对指定r计算圆的面积(python123)

平台&#xff1a;python123 题目描述: 编写函数getCircleArea(r),对给定的参数r计算圆的面积&#xff0c;并返回首先读入n&#xff08;n>0&#xff09;&#xff0c;然后依次读入n个半径r1,r2,...,rn,以这些半径为参数依次调用getCircleArea函数&#xff0c;得到对应圆的面…

3.动态规划(0x3f:从周赛中学算法 2022下)

来自0x3f 【从周赛中学算法 - 2022 年周赛题目总结&#xff08;下篇&#xff09;】&#xff1a;https://leetcode.cn/circle/discuss/WR1MJP/ 【【灵茶山艾府】2022 年周赛题目总结&#xff08;上篇&#xff09;】https://leetcode.cn/circle/discuss/G0n5iY/ 学习动态规划是否…

( 栈和队列) 503. 下一个更大元素 II ——【Leetcode每日一题】

❓503. 下一个更大元素 II 难度&#xff1a;中等 给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一个更大的元素 是按数组遍历顺序&#xff0c;这个数字…

为何越来越多人不喜欢“试用期六个月”的公司?网友:感觉不靠谱

众所周知&#xff0c;任何一份工作都有试用期&#xff0c;一般是三月左右。但如果你遇到试用期达到半年的公司&#xff0c;你会不会进入&#xff1f; 近日&#xff0c;就有人遇到了此类公司&#xff0c;并对是否要进入该公司犹豫不决。他在论坛上发帖求助&#xff1a;大家是怎…