C++11Lambda表达式

2023-11-13

Lambda表达式:

定义:

        可以理解为一个匿名函数。和函数一样,lambda表达式具有一个返回类型、一个参数列表和一个函数体。

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

capture list:表示捕获列表,捕获的是lambda所在函数中定义的局部变量
parameter list:表示参数列表
return type:返回类型
function body:函数体

捕获列表:

1.  auto func = [](int a) {return a; };//捕获列表为空,即什么都不捕获

2.  int b=10;

     auto func = [b]() {return b; };//值捕获,仅获取值,不获取指针

3   int b=10;

     auto func = [&b]() { b=99;return b; };//引用捕获,获取值,获取指针(可修改值),调用func()后,b变为99。

---------------------------------------------------------------------------------------------------

4  int i = 10;
    int j = 20;
    int k = 30;

    auto test1 = [=]() { cout <<"i为:"<< i << endl <<"j为:" << j << endl<< "k为:" << k << endl; };// 捕获列表中的”=“表示,获取Lambda表达式所在函数体内的所有局部变量,叫默认值捕获,仅可获取值,不获取指针

5  int i = 10;
    int j = 20;
    int k = 30;

    auto test3 = [&]() { i=k=j = 999; cout << "i为:" << i << endl << "j为:" << j << endl << "k为:" << k << endl; };// i,j和k的值都被修改为999,因为捕获列表中的"="表示获取Lambda表达式所在函数体内所有局部变量的引用,叫默认引用捕获。获取指针和值,可修改值。

代码实现验证:

#include<iostream>
using namespace std;
int main()
{
	int i = 10;
	int j = 20;
	int k = 30;
	auto func = [](int a) {return a; };
	cout << "func为:" << func(10) << endl;

	auto max = [](int a, int b) {if (a > b) { return a; } else return b; };
	cout << endl<< "max为:" << max(4, 44) << endl;

	auto test1 = [=]() { cout <<"i为:"<< i << endl <<"j为:" << j << endl<< "k为:" << k << endl; };
	auto test2 = [=, &i]() { i = 99; cout << "i为:" << i << endl << "j为:" << j << endl << "k为:" << k << endl; };
	auto test3 = [&, i]() { k=j = 999; cout << "i为:" << i << endl << "j为:" << j << endl << "k为:" << k << endl; };

	cout << endl << "test1----------------" << endl;
	test1();

	cout << endl << "test2----------------" << endl;
	test2();
	cout << "i的值为:" << i << endl;

	cout << endl << "test3----------------" << endl;
	test3();
	cout << "i的值为:" << i << endl;

	return 0;
}

测试:

 i的值在test2()和test3()中不一样,但是在main函数体内,调用test2()后i的值一直是99,说明了Lambda表达式在预编译阶段完成。

function及bind函数:

#include<iostream>
using namespace std;
#include<functional>

class Test
{
public:
	static int myTest(int n)
	{
		return n;
	}

	int operator()(int n)
	{
		return n;
	}
};
int test(int n)
{
	return n;
}
void foo(int a,int b, int c)
{
	cout << a << b << c << endl << endl;
}
int main() 
{
	//函数对象包装器
	//为函数提供容器(即封装)

	//支持四种函数
	//1.普通函数
	function<int(int)> f1= test;
	cout << "f1=" << f1(100) << endl;

	auto f2 = test;
	cout << "f2=" << f2(200) << endl;;

	//2.匿名函数
	function<int(int)> f3 = [](int n)->int {return n; };
	cout << "f3=" << f3(300) << endl;

	function<int(int)> f4 = [](int n) {return n; };
	cout << "f4=" << f4(400) << endl;

	//3.成员函数
	function<int(int)> f5 =Test::myTest;
	//auto f5 = &Test::myTest;
	Test t1;
	cout << "f5=" << f5(500) << endl;


	//4.仿函数
	function<int(Test*, int)> f6 = &Test::operator();
	cout << "f6=" << f6(&t1, 600) << endl;

	auto f7=bind(foo, 10, 20, 30);
	f7();

	auto f8 = bind(foo, 10, placeholders::_1, 30);
	f8(20);

	auto f9 = bind(foo, placeholders::_2, placeholders::_1, 30);
	f9(10,20);
	return 0;
}

   auto f9 = bind(foo, 10, placeholders::_1, 30);

   //error! 因为第一个参数还没使用就使用第二个参数了
   f9(20);//error! 

测试:

智能指针:

unique_ptr:

        有且仅有一个,不能拷贝,不能赋值。假设两个引用指向同一个指针,如果一个引用销毁了该指针,那么另一个引用则为空,会导致内存泄露,因此编译器不让unique指针进行赋值或拷贝操作。

unique_ptr<Test> t1 = make_unique<Test>();

unique_ptr<Test> t1(new Test());// 可能会出现异常安全问题

unique_ptr<Test> t2 = t1;//error!

 shared_ptr:

        该指针可共享,(都为共享指针时)赋值或拷贝一次会增加引用数,当引用数为零时,内存释放。什么情况下,引用减少呢?就是共享指针脱离作用域时减少一次引用数。

shared_ptr<Test> t2 = make_shared<Test>();//进行一次内存分配

shared_ptr<Test> t3 (new Test());//会进行两次内存分配,new了后再拷贝,共两次。

shared_ptr<Test> t4;

t4=t3;//引用数+1。

 weak_ptr:

        目的是为配合 shared_ptr 而引入的一种智能指针来协助 shared_ptr 工作, 它只可以从一个 shared_ptr 或另一个 weak_ptr 对象构造不会增加共享指针的引用数,也是在作用域内生存,脱离生存期立即死亡。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++11Lambda表达式 的相关文章

随机推荐

  • 深度优先搜索——搜索与回溯,从n个数中取出r个数的排列

    5 2 1 include
  • IDFA 单元测试以及单元测试覆盖率步骤

    一 单元测试类 1 新建java类 随意选择java类文件 新建一个Java类CountVowel 用来统计字符串中元音的个数 代码如下 public class CountVowels private static boolean isV
  • JAVA微信公众号

    1 微信公众号介绍 账号分为服务号 订阅号 小程序 服务号和订阅号开发类似 但是申请服务号必须是企业 所以学习的话申请一个订阅号 测试账号即可 2 注册订阅号 第一步 访问 微信公众平台 点击立即注册按钮 第二步 注册类型页面选择订阅号 第
  • 【模型复杂度】torchsummary、torchstat和profile的使用

    模型的复杂度分析也是不同模型比较的重要指标 包括模型参数 浮点运算次数 Floating point operations FLOPs 内存占用和运存占用等 记录一下可以评价模型复杂度的方法 1 torchsummary torchsumm
  • C-结构体

    目录 结构体 定义结构体 第一种方式 定义的同时定义变量名 第三种方式 赋值和初始化 如何取出结构体成员 结构体变量 结构体指针作为函数参数进行传递 结构体运算 结构体 形成了一个新的数据类型 定义结构体 第一种方式 定义一个新的数据类型
  • GD32的项目源码从台式机拷贝到笔记本,烧录后串口数据异常

    目录 1 问题描述 2 故障排查 3 问题分析 4 问题总结 1 问题描述 最近一个项目 需要外场调试 将台式机的源代码拷贝到笔记本中 通过笔记本烧录程序到设备中 发现串口数据异常 重新使用台式机进行烧录 则设备输出正常 2 故障排查 由于
  • 系统架构设计高级技能 · Web架构设计

    现在的一切都是为将来的梦想编织翅膀 让梦想在现实中展翅高飞 Now everything is for the future of dream weaving wings let the dream fly in reality 点击进入系
  • webpack多页面改名的注意事项

    今天在进行项目打包时 由于甲方新规定了文件的名字 需要我们对原先的文件名进行重命名 这个需求是不是很简单 确实很简单 但是一不注意 就会给自己造成找错半天 原来的名字 进行改名 webpack同步更改如下 满心欢喜的以为自己改完了 然后np
  • Volley 源码解析

    1 功能介绍 1 1 Volley Volley 是 Google 推出的 Android 异步网络请求框架和图片加载框架 在 Google I O 2013 大会上发布 名字由来 a burst or emission of many t
  • BeanUtil拷贝对象或集合时属性名不对应导致为空

    项目场景 源和目标实体类中的客户ID字段不对应 在使用Hutool的BeanUtil拷贝时字段为空 问题描述 源实体类属性 客户ID private String customerId 目标实体类属性 客户ID private String
  • jquery 小数计算保持精度,同时保留两位数

    点击打开链接 Num 3 Price 11 50 Number Price Num toFixed 2 34 50
  • pytorch 模型GPU推理时间探讨3——正确计算模型推理时间

    前言 上文说到 在统计pytorch模型的推理时间时发现每次的前几次推理耗时都非常多 而且在后面多次的推理中 其时间也呈现出很大的变化 后来经过调研 得知模型在GPU上推理时 需要对GPU进行一个warm up阶段 使得显卡达到工作状态 对
  • 串口拦截通信数据信息

    最近手头上有一个需要通信的外部设备 流量计 直接去看他的通信手册 里面没有例子 SO 刚开始看不太懂 官网上面有一个上位机软件 可以直接操作软件去设置参数 故 利用此上位机软件发送指令 然后在上位机和设备之间引出TX与RX 从而拦截二者串口
  • Qt类中使用函数指针

    使用函数指针有三步骤 1 声明一个函数指针 返回值类型和参数类型要与待指向的函数类型和参数一致 2 获取函数的地址 函数指针指向函数名 3 使用函数指针来调用所指向的函数 class Widget public QWidget public
  • CORE-ESP32C3

    目录 参考博文 源于网友oled eink aht10项目 源代码修改及复现说明 主要修改 显示效果 编辑硬件准备 软件版本 日志及soc下载工具 软件使用 接线说明 天气显示屏 硬件接线 温度采集 日期温度显示屏 正常初始化LOG 示例代
  • Spring Boot跨域问题简介

    什么是跨域问题 在Web开发中 跨域指的是在浏览器中访问一个不同于当前域名的资源 浏览器出于安全考虑 限制了这种跨域资源的访问 具体来说 当浏览器使用XMLHttpRequest或Fetch API发送跨域请求时 目标服务器必须在响应头中包
  • Python爬虫-11-response.text出现乱码的解决方案

    代码如下 这里是封装的一个下载url页面的方法 import requests def download page url user Agent None referer None print Downloading url headers
  • 前端xp单位和数值批量转换插件 编辑器正则匹配搜索

    因为要使手机端app自适应ipad端 所以要把项目中部分使用px的固定单位的改为相对单位 uniapp中规定了页面的宽度为750rpx 所以改起来还是很简单的 但是使用正则匹配修改px单位为rpx 编辑器可以按照正则匹配 但是因为没有运算功
  • 怎么禁用Windows Defender?

    如果你没有安装第三方杀毒软件 Windows10会自动激活其内置的Window Defender杀毒软件 虽然Windows Defender是Windows内置的 但是杀毒能力只能算比较平庸 并且在很多操作步骤和使用方法都不太符合用户的习
  • C++11Lambda表达式

    Lambda表达式 定义 可以理解为一个匿名函数 和函数一样 lambda表达式具有一个返回类型 一个参数列表和一个函数体 语法 capture list parameter list gt return type function bod