C++11新特性之lambda表达式

一、lambda表达式的优点

lambda是c++11非常重要也是最常用的特性之一,他有以下优点:

  • 就地匿名定义目标函数或函数对象,不需要额外写一个命名函数或函数对象。
  • lambda是一个匿名的内联函数
  • 简洁:避免了代码膨胀和功能分散,让开发更加高效。
  • 在需要的时间和地点实现功能闭包,使程序更加灵活。

二、lambda表达式的语法

lambda 表达式定义了一个匿名函数,语法如下:

[capture](params) opt -> ret {body;};

capture是捕获列表,params是参数列表,opt是函数选项,ret是返回值类型,body是函数体。

1、捕获列表[]:捕获一定范围内的变量

2、参数列表(): 和普通函数的参数列表一样,如果没有参数参数列表可以省略不写

auto fun = [](){return 0;};
auto fun = []{return 0;};

3、opt选项,不需要可以省略

  • mutable: 可以修改按值传递进来的拷贝(注意是能修改拷贝,而不是值本身)
  • exception: 指定函数抛出的异常,如抛出整数类型的异常,可以使用throw();

4、返回值类型:在C++11中,lambda表达式的返回值是通过返回值后置语法来定义的。

5、函数体:函数的实现,这部分不能省略,但函数体可以为空。

三、捕获列表

  • [ ] 不捕获任何变量
  • [&] 捕获外部作用域中的所有变量,并且按照引用捕获
  • [=]捕获外部作用域的所有变量,按照值捕获,拷贝过来的副本在函数体内是只读的
  • [= ,&a] 按值捕获外部作用域中的所有变量,并且按照引用捕获外部变量 a
  • [bar] 按值捕获bar变量,不捕获其他变量
  • [this] 捕获当前类中的this指针,让lambda表达式拥有和当前类成员函数同样的访问权限

       使用lambda表达式捕获列表捕获外部变量,如果希望去修改按值捕获的外部变量,这就需要使用mutable选项,被mutable修改是lambda表达式就算没有参数也要写明参数列表,并且可以去掉按值捕获的外部变量的只读(const)属性。

int a = 0;
auto f1 = [=] {return a++; };              // error, 按值捕获外部变量, a是只读的
auto f2 = [=]()mutable {return a++; };     // ok

四、返回值

        一般情况下,不指定lambda表达式的返回值,编译器会根据return语句自动推导返回值类型,但是需要注意的是lambda表达式不能通过列表初始化自动推导出返回值类型。

	// 可以自动推导出返回值类型
	auto f = [](int i)
	{
		return i;
	}

	// 不能推导出返回值类型
	auto f1 = []()
	{
		return { 1, 2 };	// 基于列表初始化推导返回值,错误
	}

五、用法

举例:和STL搭配使用

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

int main()
{
	vector<int> vec = {1,2,3,4,5,6};
	sort(vec.begin(), vec.end(), [](int a, int b)
	{
		return a > b;
	});
	for (auto it : vec)
	{
		cout << it << " ";
	}
}

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

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

相关文章

强化学习——马尔可夫奖励过程的理解

目录 一、马尔可夫奖励过程1.回报2.价值函数 参考文献 一、马尔可夫奖励过程 在马尔可夫过程的基础上加入奖励函数 r r r 和折扣因子 γ \gamma γ&#xff0c;就可以得到马尔可夫奖励过程&#xff08;Markov reward process&#xff09;。一个马尔可夫奖励过程由 < S , …

网络编程:服务器模型-并发服务器-多进程

并发服务器概念&#xff1a; 并发服务器同一时刻可以处理多个客户机的请求 设计思路&#xff1a; 并发服务器是在循环服务器基础上优化过来的 &#xff08;1&#xff09;每连接一个客户机&#xff0c;服务器立马创建子进程或者子线程来跟新的客户机通信 &#xff08;accept之后…

Web APIs(获取元素+操作元素+节点操作)

目录 1.API 和 Web API 2.DOM导读 DOM树 3.获取元素 getElementById获取元素 getElementsByTagName获取元素 H5新增方法获取 获取特殊元素 4.事件基础 执行事件 操作元素 修改表单属性 修改样式属性 使用className修改样式属性 获取属性的值 设置属性的值 移除…

【多人协作】场景模拟(一)

文章目录 实现多人协作场景&#xff1a;操作流程1开发人员a和b克隆仓库到本地2在本地仓库建立分支并与远程分支建立链接3开发人员工作并提交代码4将合并dev分支与master分支 实现多人协作 多人协作开发是git的最核心也是最重要的操作。多人协作也就意味着同一时间里&#xff0…

基于springboot+vue+Mysql的音乐翻唱与分享平台

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

2024年3月 青少年等级考试机器人理论真题三级

202403 青少年等级考试机器人理论真题三级 第 1 题 流程图图例如下&#xff0c;与该图例功能对应的选项是&#xff1f;&#xff08; &#xff09; A&#xff1a;开始/结束 B&#xff1a;输入/输出 C&#xff1a;判断 D&#xff1a;处理 第 2 题 Arduino UNO/Nano主控板&am…

鸿蒙ArkUI开发:常用布局【弹性布局方向图】

弹性布局方向图 Flex({ direction: FlexDirection.Row }) FlexDirection.Row&#xff08;默认值&#xff09;&#xff1a;主轴为水平方向&#xff0c;子组件从起始端沿着水平方向开始排布FlexDirection.RowReverse&#xff1a;主轴为水平方向&#xff0c;子组件从终点端沿着F…

【机器学习300问】83、深度学习模型在进行学习时梯度下降算法会面临哪些局部最优问题?

梯度下降算法是一种常用的优化方法&#xff0c;用于最小化损失函数以训练模型。然而&#xff0c;在使用梯度下降算法时&#xff0c;可能会面临以下局部最优问题。 &#xff08;一&#xff09;非凸函数的局部极小值 问题描述&#xff1a;在复杂的损失函数中&#xff0c;如果目…

2023年上半年信息系统项目管理师——综合知识真题与答案解释(3)

2023年上半年信息系统项目管理师 ——综合知识真题与答案解释(3) 整个4月份都在忙处理我家所在楼的电梯托管工作&#xff0c;红头文件的5月期限&#xff0c;临时加入&#xff0c;人少琐事较多&#xff0c;从寻找电梯托管公司&#xff0c;整理总结托管公司资料&#xff0c;组织…

基于SpringBoot+微信小程序的订餐(点餐)配送系统设计与实现+毕业论文(12000字)

系统介绍 本微信小程序在线订餐系统管理员功能可以修改个人中心&#xff0c;用户管理&#xff0c;菜品分类管理&#xff0c;菜品信息管理&#xff0c;订单信息管理&#xff0c;取消订单管理&#xff0c;订单配送管理&#xff0c;菜品评价管理以及系统管理。微信小程序用户可以…

企业邮箱是什么?怎么申请一个企业邮箱

企业邮箱是什么&#xff1f;企业邮箱包含着许多企业需要的功能&#xff0c;包含统一创建签名、大容量存储、域名定制等功能&#xff0c;这些功能能够帮助企业更好地展示企业的专业形象以及更好得协作办公。本文将详细介绍企业邮箱的概念、特征和企业邮箱的申请步骤。 一、企业…

云原生技术解析

云原生的概念 云原生是一种软件架构和部署方法&#xff0c;旨在利用云计算的优势&#xff0c;以更灵活、可扩展和可靠的方式构建和部署应用程序。它主要关注在容器、微服务、自动化和持续交付等方面。 云原生技术是指以云计算作为基础&#xff0c;以平台和工具为依托&#xff0…

2024年视频号小店值不值得做?看完这五点,茅塞顿开!

大家好&#xff0c;我是电商糖果 视频号小店做为今年讨论度最高的电商项目之一&#xff0c;关于它值不值得做&#xff0c;在网上可以说讨论的非常激烈。 糖果做小店已经快两年了&#xff0c;按照我目前的经营状态来说&#xff0c;对这个平台还是非常满意的。 当然最满意的还…

JDK的串行收集器介绍与优化指南-01

JDK串行收集器概述 定义与背景 串行收集器&#xff08;Serial Collector&#xff09;是Java虚拟机&#xff08;JVM&#xff09;中的一种单线程垃圾收集器&#xff0c;它在垃圾收集过程中会暂停所有工作线程&#xff0c;直至收集完成。它适用于内存资源受限、对吞吐量要求不高…

【面试经典题】环形链表

个人主页&#xff1a;一代… 个人专栏&#xff1a;数据结构 在面试中我们经常会遇到有关链表的相关题目&#xff0c;面试官通常会对题目给出拓展 下面我就两个leetcode上的一个双指针的题目为例&#xff0c;并对其进行拓展 题目链接&#xff1a;环形链表 题目描述&#xf…

python内置函数exec()和eval()区别

在Python中&#xff0c;eval() 和 exec() 都是内置函数&#xff0c;用于执行存储在字符串或对象中的Python代码&#xff0c;但它们之间也有一些区别。 eval() 语法&#xff1a;eval(expression, globalsNone, localsNone) expression&#xff1a;需要求值的字符串表达式。可…

经典文献阅读之--LiDAR-based 4D Occupancy Completion and Forecasting(基于激光雷达的4D占用补全与预测)

0. 简介 本文介绍了基于激光雷达的4D占用补全与预测。场景补全与预测是自动驾驶汽车等移动智能体研究中的两个常见的感知问题。现有的方法独立地处理这两个问题&#xff0c;导致这两方面的感知是分开的。在《LiDAR-based 4D Occupancy Completion and Forecasting》中&#xf…

基于单片机的自动售货机系统

基于单片机的售货机系统 &#xff08;仿真&#xff0b;程序&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 1.货物种类一共设有8种&#xff0c;这8种商品通过选择按键进行选择确认&#xff1b; 2.通过数量选择按键确定购买数量&#xff0c;价格规定为1-8…

Spring Boot日志

目录 一、日志概述 1、为什么要学习日志&#xff1f; 2、日志的用途 &#xff08;1&#xff09;系统监控 &#xff08;2&#xff09;数据采集 &#xff08;3&#xff09;日志审计 二、日志使用 1、打印日志 &#xff08;1&#xff09;在程序中得到日志对象 &#xf…