首页 > 编程语言 >C++11新特性lambda

C++11新特性lambda

时间:2024-11-14 15:45:27浏览次数:3  
标签:11 函数 int 捕获 C++ 复制 数组 lambda

文章目录


前言

本文介绍C++11新特性中的lamdba

在C++11中支持了lambda表达式,如果你想生成一个简短、方便调用、函数内部清晰的轻量级函数,
lambda是一个不错的选择。它允许我们在函数中生成函数,也可以向对待函数一样对待lambda。


lambda

  • 首先看使用,对比跟普通函数声明的区别,lambda函数多了几部分
    尽管lambda通常使用在函数内部,但它也能在全局范围内声明
// 使用
int lm_greater = [](int x,int y){
	return x>y?x:y;
	};

  • 定义
    lambda函数通常由这几部分组成
    []方括号中填捕获值,()圆括号中填参数,{}花括号为函数体。
// 定义
[](){return ;};

/** 如果不想要返回值,或者显式指定返回值类型: */
auto lm = [](...) -> void{...};
auto lm = [](...) -> int{return (int);};

  • 捕获
    方括号[]内代表捕获内容,这是跟普通函数样子上的主要区别 。
    关于[]内的值:
    [&]代表捕获所有有效作用域内值的引用,即可以修改捕获到的值;
    [=]代表捕获所有有效作用域内值的复制,就是复制一份在lambda函数体内使用,但不影响函数体外;
    [&N,=]代表捕获N的引用,并捕获其他所有值的复制;
    [=N,&]代表复制一份N,并捕获其他所有值的引用;
    复制引用圆括号()中的使用是类似的,具体怎么选择还需要在实践中体验!
    如果不清楚什么是复制、什么是引用,这里简单陈述一下:引用取地址符&,填写进来的形参在函数体内被修改会影响函数体外的实参;若不使用取地址符&,传进来的参数其实会被复制一份当作形参使用,被视为复制,这也是为什么函数内形参的修改,不会改变体外参数值的原因。
// 捕获
main:
	int x,y;
	void lm = [&](){ x=10;	y=20; };	*这个lambda函数将要修改x,y的值(前提是在有效作用域内声明了x,y)
	lm();

进阶用法

  • ​一般地,在使用sort()函数,sort()函数基本用法:void sort(it.begin(),it.end(),function)其中第三个参数是可选项,这表示默认情况下如果对一个整数数组使用sort()后,数组会变为升序,而若启用第三个参数,可以自定义排序规则,比如使用lambda:
#include<vector>

vector<int> v = {2,5,3,1};
sort(v.begin(),v.end(),[](int x,int y){return x>y;});	//数组会变为降序

​ 而无论是lambda还是普通函数,都可以用C++标准库中std::function<void(int)>模版来表示。
定义scan()函数,接收一个数组、长度及一个函数,scan()函数会对arr数组中的每个元素执行funs()函数。

void scan(int arr[],int len,function<void(int)>  funs){
   for(int i=0;i<len;i++)
      funs(arr[i]);
}

​ 这样就允许我们对同个或多个数组更简洁的执行不同操作,当然一般是些简单的操作,比如数组求和,打印数组元素,查找某个元素等。例如:

* main: 

// 求和
int sum=0;
scan(arr,len,[&sum](int x){sum+=x;});

// 打印
scan(arr,len,[](int x){cout<<x<<" ";});

// 查找
int key;
scan(arr,len,[](int x){if(x==key)	cout<<"key exist"});

总结

  • 以上就是常用的lambda用法,学会使用lambda,能让代码更简洁、提高代码可读性。作为C++11中的新特性,强烈建议大家学起来~

如有疏漏错误,还望补充纠正,感激不尽!

标签:11,函数,int,捕获,C++,复制,数组,lambda
From: https://blog.csdn.net/2301_76622358/article/details/143771566

相关文章

  • win11下安装maven及配置idea maven
    官网下载maven,地址:https://maven.apache.org/download.cgi下载好之后,解压到某一个盘目录下,本人解压到:D:\Develop\Java,后面配置环境变量时以自己解压路径目录为准配置环境变量在系统变量中新增变量MAVEN_HOME="自己解压的路径目录"在系统变量中找到path,双击打开......
  • AT_arc112_f [ARC112F] Die Siedler
    首先考虑最终状态下该如何操作,显然能换牌就换牌。然而问题仍然非常复杂,该怎么继续思考呢?我们打开题解发现,在这个问题中,对于一个局面\((c_1,c_2,\cdots,c_n)\),与另一个局面\((k,0,\cdots,0)\)是等价的,为什么呢?因为我们有能换就换的策略,对于第一种牌若不断采取能换就换的策略,肯......
  • c++和c的不同及c++扩展内容
    头文件不同c++采用iostream库,并且作用与std领域中;标准格式:Usingnamespacestd#include<iostream>Intmain(){xxxxxSystem("pause");Return0;}提出了四个作用区域全局区代码区栈区堆取全局区:用来存放所有的全局变量,或宏定义代码,静态变量和常量;代码区:用来......
  • STL标准模板库c++
    STL:广义上分为:容器,算法,迭代器容器与算法间通过迭代器进行无缝连接。STL六大组件,分别是容器,算法,迭代器,仿函数,适配器,空间配置器。vector容器可以理解为数组;为单端数组,区别在于数组为静态空间,而vector可以动态扩展动态扩展:不是在原空间下,找到更......
  • 单向链表题库2(c++)
    目录前言[1.力扣——LCR123.图书整理I](https://leetcode.cn/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof/description/)[2.力扣——LCR024.反转链表](https://leetcode.cn/problems/UHnkqh/submissions/580256040/)[3.力扣LCR141.训练计划III](https://le......
  • 11.14
    三个题的理论复杂度都遥遥领先!!!\(100+95+100=295\)感觉有点送,可能是中途要穿插信息会考的原因?A.没找到⚪状压复杂度\(10\times10^5\times10=10^7\)太劣了!让我们建个\(\text{AC}\)自动机,\(10\times500\times10=5\times10^4\)遥遥领先。所以怎么才能保证自己写完\(\text{......
  • 【题解】洛谷P11186: 三目运算
    不好玩!!!这是个树形结构,直接暴力模拟,但过不去,但是需要发现答案是个区间,我们对字符串处理时记录最大值最小值,然后到叶子节点时我们将此时的区间存起来,查询时直接二分查询这个数对于的区间就可以了。总结:不好玩!!!#include<bits/stdc++.h>usingnamespacestd;#definelllonglon......
  • 11.13
    A.防诈骗\(\text{Sol1:}\)首先可以把这\(n\)个水杯划分为不交的链,对链暴力\(\mathrm{mex}\)之后发现很有规律,按照经典结论把所有游戏的\(SG\)函数求异或和,如果为\(0\)那么后手必胜,否则必败。但是由于是求第\(k\)小满足后手必胜的\(n\),所以只能拿答案\(\le10^7\)的......
  • 精品软件推荐:11款适合产品经理的项目管理工具!
    作为产品经理,项目管理工具不仅能帮助你更高效地规划、跟踪和执行项目任务,还能促进团队协作、沟通和信息共享。以下是11款适合产品经理的项目管理工具,其中包括了国内外的优秀工具,都是非常适合产品经理和开发团队使用的项目管理系统。1.禅道(ZenTao)禅道是一款专为产品经理和开发团......
  • [KB]Windows 11自动黑屏,疑似自动进入休眠状态
    问题现象:Windows11在电源现象中设置了,永不睡眠(Sleep);永不关闭Disk等电源设置项目后,依旧会自动进入疑似休眠的状态。可以尝试以下方法:#查看当前设定PSC:\Users\Administrator>powercfg-aThefollowingsleepstatesareavailableonthissystem:Standby(S3)......