C++--lambda表达式

在这里插入图片描述

介绍

一个lambda表达式表示一个可调用的代码单元。我们可以将其理解为一个未命名的内联函数。和函数类型,lambda有一个返回值,一个参数列表和一个函数体,但比函数多一个捕获列表。具体形式如下:

[捕获列表](参数列表) ->返回值类型 {函数体}
    其中:
    捕获列表:可以捕获定义lambda表达式所在的函数中定义的局部变量,通常为空即[ ]
        参数列表:和普通函数类似。
        返回值类型:使用尾置返回,可以省略,一般省略。
        函数体:和普通函数类似。

例如比较两个数大小的lambda表达式:

 [](int x , int y){ return x > y; }  //比较x和y的大小 

在上面的表达式中,x,y是接收的参数,如果省略返回值类型,lambda根据函数体推导返回值类型为bool。
lambda的调用方式和普通函数调用方式相同。

int main()
{
    auto f = [](int x, int y) {return x > y ? x : y; };//求较大值的lambda
    cout << f(10, 20); //像普通函数一样调用lambda

    return 0;
}

不带参数lambda

int main() 
{
    auto f2 = []() {cout << "没有参数" << endl; }; 
    f2(); //调用f2 

    auto f3 = [] {cout << "没有参数,参数列表的()都可以省略" << endl; }; 
    f3();//调用f3 

    return 0; 
}

如果lambda不带参数,其参数列表的()都可以省略不写(这和普通函数不同)。
使用捕获列表
lambda是定义在函数内部的,它可以通过捕获列表使用函数内部的变量。

int main()
{
    const int a = 10;

    //求参数x,y和函数局部变量a三者的最大值
    auto f = [a](int x, int y) {int z = (x > y ? x : y); return z > a ? z : a; };
    int b, c;
    cin >> b >> c;
    cout << f(b, c) << endl;

    return 0;
}

在这里插入图片描述
上面的捕获列表设计看似没有必要,因为可以增加一个参数。但在很多情况下参数的个数是固定的。比如算法需要的谓词。如果想传递更多的参数就必须使用捕获列表了。
例如,使用cout_if算法。

#include<algorithm>
#include <iostream>
#include <vector>
using namespace std;

//输出容器的所有元素
template<typename T>
void Show(const T& v)
{
    for (const auto x : v)
        cout << x << " ";
    cout << endl;
}

int main()
{
    vector<string> v{"China", "Singapore", "Japan", "India", "Malaysia", "Finland", "France"};
    cout << "v:"; Show(v);

    //统计国家名称长度小于6的国家数量
    cout << "国名长度小于6的国家数量:";
    cout << count_if(v.begin(), v.end(), [](const string& s) {return s.length() < 6; }) << endl;

    return 0;
}

如果想把上面的程序设计的更灵活,用于统计(国名)长度小于任意参数的国家数量,那么需要在lambda中增加一个长度的参数。但是cout_if的第三个参数只能是一元谓词(只能是一个参数)。那么就会出现语法错误。

//下面这句代码出现语法错误,因为count_if的第三个参数只能是一元谓词,不能有两个参数
count_if(v.begin(), v.end(), [](const string& s,int sz) {return s.length() < sz; });

这时可以通过捕获列表(也可以通过仿函数)解决这个问题。

#include<algorithm>
#include <iostream>
#include <vector>
using namespace std;

//输出容器的所有元素
template<typename T>
void Show(const T& v)
{
    for (const auto x : v)
        cout << x << " ";
    cout << endl;
}

int main()
{
    vector<string> v{"China", "Singapore", "Japan", "India", "Malaysia", "Finland", "France"};
    Show(v); //输出元素
    int sz;  //国家名称长度的上限
    cout << "请输入需要统计的长度:";
    cin >> sz;

    //统计国家名称长度小于sz的国家数量
    cout << "国名长度小于" << sz << "的国家数量:";
    cout << count_if(v.begin(), v.end(), [sz](const string& s) {return s.length() < sz; }) << endl;

    return 0;
}

在这里插入图片描述


本篇完!

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

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

相关文章

Tita的OKR:高端制造行业的OKR案例

高端设备制造行业的发展趋势&#xff1a; 产业规模持续扩大&#xff1a;在高技术制造业方面&#xff0c;航空、航天器及设备制造业、电子工业专用设备制造等保持较快增长。新能源汽车保持产销双增&#xff0c;新材料新产品生产也高速增长。 标志性装备不断突破&#xff1a;例如…

美式键盘 QWERTY 布局的来历

注&#xff1a;机翻&#xff0c;未校对。 The QWERTY Keyboard Is Tech’s Biggest Unsolved Mystery QWERTY 键盘是科技界最大的未解之谜 It’s on your computer keyboard and your smartphone screen: QWERTY, the first six letters of the top row of the standard keybo…

亲测--linux下安装ffmpeg最新版本---详细教程

下载地址 Download FFmpeg 下载最新的https://ffmpeg.org/releases/ffmpeg-7.0.1.tar.xz 上传到服务器 解压 tar xvf ffmpeg-7.0.1.tar.xz 编译 cd ffmpeg-7.0.1 ./configure --prefix=/usr/local/ffmpeg make && make install 报错: 解决:在后面加 跳过检测…

【node-RED 4.0.2】连接操作 Oracle 数据库实现 增 删 改 查【新版,使用新插件:@hylink/node-red-oracle】

总览 上节课&#xff0c;我们说到&#xff0c;在 node-red 上链接 oracle 数据库 我们使用的插件是 node-red-contrib-agur-connector。 其实后来我发现&#xff0c;有一个插件更简便&#xff0c;并且也更好用&#xff1a;hylink/node-red-oracle &#xff01;&#xff01;&am…

LinuxShell编程1———shell基础命令

文章目录 前言 一、shell基础知识 1、shell概念 2、Shell的功能 接收&#xff1a;用户命令 调用&#xff1a;相应的应用程序 解释并交给&#xff1a;内核去处理 返还&#xff1a;内核处理结果 3、Shell种类&#xff08;了解&#xff09; 3.1、MS-DOS 3.2、Windows的…

C# 中IEnumerable与IQuerable的区别

目的 详细理清IEnumerator、IEnumerable、IQuerable三个接口之间的联系与区别 继承关系&#xff1a;IEnumerator->IEnumerable->IQuerable IEnumerator&#xff1a;枚举器 包含了枚举器含有的方法&#xff0c;谁实现了IEnuemerator接口中的方法&#xff0c;就可以自定…

R语言模型评估网格搜索

### 网格搜索 ### install.packages("gbm") set.seed(1234) library(caret) library(gbm) fitControl <- trainControl(method repeatedcv,number 10,repeats 5) # 设置网格搜索的参数池 gbmGrid <- expand.grid(interaction.depth c(3,5,9),n.trees (1:2…

走进NoSql

一、引入 1.1什么是NoSql NoSQL&#xff08;Not Only SQL&#xff09;是一组非关系型数据库&#xff08;或称为非SQL数据库&#xff09;的统称&#xff0c;它们提供了与传统的关系型数据库不同的数据存储和检索方式。NoSQL数据库通常用于处理大量的、分布式的、非结构化或半结…

Lora模型训练的参数-学习笔记

任何一个lora都会有三重属性&#xff0c;易调用性、泛化性和还原性&#xff0c;任何一个lora只能完美满足其中的两项&#xff1b; 易调用性&#xff1a;在已调用lora后&#xff0c;还需要多少提示词才能让该lora完全生效&#xff1b; 泛化性&#xff1a;能不能还原lora训练素…

全网超详细Redis主从部署(附出现bug原因)

主从部署 整体架构图 需要再建两个CentOs7,过程重复单机部署 http://t.csdnimg.cn/zkpBE http://t.csdnimg.cn/lUU5gLinux环境下配置redis 查看自己ip地址命令 ifconfig 192.168.187.137 进入redis所在目录 cd /opt/software/redis cd redis-stable 进入配置文件 vim redi…

git查看历史记录方法

0 Preface/Foreword 1 git reflog git reflog显示所有的操作&#xff0c;不仅仅是commit&#xff0c;也包括git pull&#xff0c;checout等动作。 1.1 查看本地和远程仓库的区别 远程仓库&#xff1a;中间的提交是直接在web端编辑 远程仓库&#xff1a;最新的提交是在本地编…

原码、补码、反码、移码是什么?

计算机很多术语翻译成中文之后&#xff0c;不知道是译者出于什么目的&#xff0c;往往将其翻译成一个很难懂的名词。 奇怪的数学定义 下面是关于原码的“吐槽”&#xff0c;可以当作扩展。你可以不看&#xff0c;直接去下一章&#xff0c;没有任何影响。 原码的吐槽放在前面是…

Java修仙之路,十万字吐血整理全网最完整Java学习笔记(进阶篇)

导航&#xff1a; 【Java笔记踩坑汇总】Java基础JavaWebSSMSpringBootSpringCloud瑞吉外卖/黑马旅游/谷粒商城/学成在线设计模式面试题汇总性能调优/架构设计源码-CSDN博客 推荐视频&#xff1a; 黑马程序员全套Java教程_哔哩哔哩 尚硅谷Java入门视频教程_哔哩哔哩 推荐书籍&am…

基础动态规划题目基础动态规划题目

目录 题目1&#xff1a; P1216 [USACO1.5] [IOI1994]数字三角形 Number Triangles 代码示例&#xff1a; 题目2&#xff1a; Common Subsequence 代码示例 题目3 &#xff1a;最长上升子序列 最长不下降子序列 最长上升子序列oj答案 题目1&#xff1a; P1216 [USACO1.5]…

ASP.NET Core中创建中间件的几种方式

前言 今天我们一起来盘点一下在ASP.NET Core应用程序中添加和创建中间件常见的四种方式。 中间件介绍 ASP.NET Core中间件&#xff08;Middleware&#xff09;是用于处理HTTP请求和响应的组件&#xff0c;它们被安排在请求处理管道中&#xff0c;并按顺序执行。中间件的设计是为…

15- 微分方程

对三角函数不敏感

快捷:通过胶水语言实现工作中测试流程并行、加速

通过胶水语言实现工作中测试流程并行、加速 通过胶水语言实现工作中测试流程并行、加速工作场景&#xff08;背景&#xff09;问题抽象&#xff08;挑战&#xff09;如何做&#xff08;行动&#xff09;获得了什么&#xff08;结果&#xff09;后记相关资源 通过胶水语言实现工…

十大排序 之 快速排序

&#xff01;&#xff01;&#xff01;排序仅针对于数组哦本次排序是按照升序来的哦代码后边有图解哦 介绍 快速排序英文名为Quick Sort 基本思路 快速排序采用的是分治思想&#xff0c;即在一个无序的序列中选取一个任意的基准元素base&#xff0c;利用base将待排序的序列分…

【BUG】已解决:error: subprocess-exited-with-error

已解决&#xff1a;error: subprocess-exited-with-error 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武汉城市开发者社区主…

Ubuntu上安装配置samba服务

Ubuntu上安装配置samba服务 在Ubuntu中安装配置samba共享服务&#xff0c;可以让你在网络上共享文件和打印机。以下是一个相对详细的步骤指南&#xff0c;介绍如何在Ubuntu上安装和配置Samba。 1. 安装Samba 首先&#xff0c;需要安装Samba软件包。打开终端并运行以下命令&a…