C++lambda表达式

C++lambda表达式

捕获方式

值捕获

lambda表达式值捕获的变量在lambda函数体内部不可修改,只可读

在这里插入图片描述

引用捕获

lambda表达式可以引用捕获变量、const常量、constexpr常量,捕获后的属性与之间的属性一致

在这里插入图片描述

捕获this指针

成员函数中的lambda表达式默认不能访问成员变量,需要捕获this指针才能访问

在这里插入图片描述

class Foo {
public:void Show() {auto lambda = [this]() {cout << data << endl;};lambda();}
private:int data=1;
};

需要注意的是,this指针只能以值的方式进行捕获,不能以引用的方式捕获

在这里插入图片描述

当成员函数中存在局部变量与成员变量同名时,lambda表达式函数体内默认使用局部变量,若没有对其进行捕获,编译报错

在这里插入图片描述

如果指定lambda表达式中访问成员变量,可以显示使用this->data,想要在lambda表达式中访问成员变量,需要捕获this指针,除此之外,还可以捕获*this,效果与捕获this指针一样,通常直接捕获this即可

class Foo {
public:void Show() {auto lambda = [*this]() {cout << this->data << endl;};lambda();}
private:int data = 1;
};

C++14泛型lambda

lambda表达式的参数可以使用auto

auto lambda = [](auto x, auto y) {return x + y;
};
cout << lambda(1, 1) << endl;//2
cout << lambda(string("abc"), string("def")) << endl;//abcdef

C++20模版lambda

C++20中lambda表达式可以搭配模版使用

局部lambda对象搭配模版

局部lambda对象搭配模版使用只能进行自动推导

在这里插入图片描述

全局lambda对象搭配模版使用

全局lambda对象搭配模版使用必须指定模版参数

在这里插入图片描述

lambda表达式使用技巧

lambda表达式作为函数的返回值

class Foo {
public:auto GetLambda() {auto lambda = [this]<typename T>(T val) {data += val;AddData();cout << data << endl;};return lambda;}
private:int AddData() {return ++data;}int data = 5;
};
int main() {Foo foo;auto lambda = foo.GetLambda();lambda(3);return 0;
}

需要注意的是,访问限定符只在编译阶段发挥作用,只要编译阶段可以"骗过"编译器,main函数中的lambda就能在运行时访问AddData和data

lambda表达式递归

C++lambda表达式递归的错误写法

在这里插入图片描述

原因并不是没有捕获lambda,而是无法捕获lambda

在这里插入图片描述

想要lambda表达式实现递归,可以通过参数或者包装器完成

通过function实现lambda的递归

function<int(int)> lambda = [&lambda]<typename T>(T n) {if (n <= 2) {return n;}return lambda(n - 1) + lambda(n - 2);
};
cout << lambda(10) << endl;

通过包装器完成lambda表达式的递归时,必须以引用的方式捕获,否则可能出现错误。

在这里插入图片描述

通过泛型lambda实现递归

auto lambda = [](auto&& self,int n) {if (n <= 2) {return n;}return self(self,n - 1) + self(self,n - 2);
};
cout << lambda(lambda,10) << endl;

lambda表达式搭配库函数使用

lambda表达式搭配库函数使用可以自定义运算规则和比较规则

vector<int> nums = { 1,2,3,-1,8,9,-10 };
std::transform(nums.begin(), nums.end(), nums.begin(), [](int n) {return n - 3;//将nums中的每一个数-3
});
std::for_each(nums.begin(), nums.end(), [](int n) {cout << n << ' ';//打印nums中每一个数
});
cout << endl;
std::sort(nums.begin(), nums.end(), [](int l, int r) {return abs(l) < abs(r);//按照绝对值大小排序
});
std::for_each(nums.begin(), nums.end(), [](int n) {cout << n << ' ';
});

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

了解基于Elasticsearch 的站内搜索,及其替代方案

对于一家公司而言&#xff0c;数据量越来越多&#xff0c;如果快速去查找这些信息是一个很难的问题&#xff0c;在计算机领域有一个专门的领域IR&#xff08;Information Retrival&#xff09;研究如何获取信息&#xff0c;做信息检索。在国内的如百度这样的搜索引擎也属于这个…

PyTorch实例:简单线性回归的训练和反向传播解析

文章目录 &#x1f966;引言&#x1f966;什么是反向传播&#xff1f;&#x1f966;反向传播的实现&#xff08;代码&#xff09;&#x1f966;反向传播在深度学习中的应用&#x1f966;链式求导法则&#x1f966;总结 &#x1f966;引言 在神经网络中&#xff0c;反向传播算法…

【现代机器人学】学习笔记十四:中文版印刷/翻译勘误

首先声明&#xff0c;这个印刷/勘误并非经过官方的认可&#xff0c;只是我个人的粗浅的理解。如果内容有误&#xff0c;恳请大家谅解指正。 其实有的并不算错&#xff0c;只是我个人认为不太准确&#xff0c;在我学习过程中产生了一些小疑惑和误解。 都是一些小毛病&#xff…

CleanMyMac X版本4.14.2中文版新功能介绍

CleanMyMac X版本4.14.2中文版是一款专业的Mac清理工具&#xff0c;只需要一键智能清理&#xff0c;便能让Mac恢复原始的性能&#xff0c;是MAC系统非常好用的工具。CleanMyMac X自身拥有一个安全数据库&#xff0c;它是一个项目列表&#xff0c;拥有一定的规格&#xff0c;可以…

北大硕士7年嵌入式学习经验分享

阶段 1 大一到大三这个阶段我与大多数学生相同&#xff1a; 学习本专业知识&#xff08;EE专业&#xff09;&#xff0c;学习嵌入式软件开发需要的计算机课程&#xff08;汇编原理&#xff0c;计算机组成原理&#xff0c;操作系统&#xff0c;C语言等&#xff09;&#xff0c…

UE5.1编辑器拓展【二、脚本化资产行为,快速更改资产名字,1.直接添加前缀或后缀2.通过资产类判断添加修改前缀】

目录 了解相关的函数 第一种做法&#xff1a;自定义添加选择资产的前缀或后缀 代码 效果 第二种做法&#xff1a;通过映射来获取资产类型添加前缀和修改前缀 映射代码 代码 效果 在之前一章中&#xff0c;我们创建了插件&#xff0c;用来扩展编辑器的使用&#xff1a; …

Docker-mysql,redis安装

安装MySQL 下载MySQL镜像 终端运行命令 docker pull mysql:8.0.29镜像下载完成后&#xff0c;需要配置持久化数据到本地 这是mysql的配置文件和存储数据用的目录 切换到终端&#xff0c;输入命令&#xff0c;第一次启动MySQL容器 docker run --restartalways --name mysq…

如何在 Windows 上安装 ONLYOFFICE 协作空间社区版

ONLYOFFICE 协作空间是一个在线协作平台&#xff0c;帮助您更好地与客户、业务合作伙伴、承包商及第三方进行文档协作。今天我们来介绍一下&#xff0c;如何在 Windows 上安装协作空间的自托管版。 ONLYOFFICE 协作空间主要功能 使用 ONLYOFFICE 协作空间&#xff0c;您可以&a…

solidity 合约转java

Generate a Java Wrapper from your Smart Contract Solidity Gradle Plugin - Web3j web3j / web3j-maven-plugin GitLab

基于SpringBoot的网上超市系统

基于SpringBoot的网上超市系统的设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 【主要功能】 角色&#xff1a;用户、管理员 管理员&#xff1a;个人中心、用户管理、商品分类…

Centos7 安装mysql 8.0.34并设置不区分大小写

索引 Centos7 安装mysql 8.0.34准备工作安装教程安装并配置配置MySQL配置远程访问重新启动MySQL服务 为已安装的MySQL8设置不区分大小写背景操作步骤 Centos7 安装mysql 8.0.34 准备工作 centos7 服务器 xshell 安装教程 安装并配置 在安装MySQL之前&#xff0c;我们应该…