iis6.0如何做网站301/网站推广平台有哪些
目录
1、引言
2、仿函数
3、lambda表达式
3.1、lambda表达式的一般形式
3.2、返回类型说明
3.3、捕获列表的规则
3.4、可以捕获哪些变量
3.5、lambda表达式给编程带来的便利
VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)
https://blog.csdn.net/chenlycly/article/details/125529931C++软件分析工具从入门到精通案例集锦(专栏文章正在更新中...)
https://blog.csdn.net/chenlycly/article/details/131405795C/C++基础与进阶(专栏文章,持续更新中...)
https://blog.csdn.net/chenlycly/category_11931267.html C++11新特性很重要,作为C++开发人员很有必要去学习,不仅笔试面试时会涉及到,开源代码中也在大规模的使用。以很多视频会议及直播软件都在使用的开源WebRTC项目为例,WebRTC代码中大篇幅地使用了C++11及以上的新特性,要读懂其源码,必须要了解这些C++的新特性。所以,接下来一段时间我将结合工作实践,给大家详细讲解一下C++11的新特性,以供借鉴或参考。
1、引言
在C++中我们可以使用函数名、函数指针、仿函数去实现函数的调用。C++11引入了lambda表达式,又称匿名函数,给我们引入了一种新的函数调用方式,给我们编程带来了很大的便利。今天我们来讲讲仿函数和lambda表达式。
2、仿函数
仿函数是一种特殊的类或结构体,不是C++11引入的,之前就有了。它重载了函数调用运算符operator(),并且可以像函数一样被调用,同时它也可以拥有自己的数据成员和成员函数。仿函数通常用于算法(如sort、find、transform等)和容器(如set、map、list等)中,以提供自定义的操作行为。在C++11中,可以使用lambda表达式实现简单的仿函数。
下面是个类中重载 operator()的实例:
class MyFunctor
{
public:MyFunctor(int tmp) : round(tmp) {}int operator()(int tmp) { return tmp + round; }
private:int round;
};int main()
{int round = 2;MyFunctor f(round); //调用构造函数cout << "result = " << f(1) << endl; // operator()(int tmp)return 0;
}
通过类对象去调用重载的operator()方法。 在C++里,我们通过在一个类中重载operator()运算符的方法,去使用一个函数对象而不是一个普通函数。
再看一个比较数大小的实例:
class compare_class
{public:bool operator() (int A, int B) const{return A < B;}
};// Declaration of C++ sorting function.
template<class ComparisonFunctor>
void sort_ints(int* begin_items, int num_items, ComparisonFunctor c);int main()
{int items[]={4, 3, 1, 2};compare_class functor;sort_ints( items, sizeof(items)/sizeof(items[0]), functor);
}
3、lambda表达式
lambda表达式,又称匿名函数,是一个可调用的代码单元,可以理解为一个未命名(匿名)的内联函数。与一般的函数类似,lambda表示式有一个返回类型、一个参数列表和一个函数体。但和函数不同的是,lambda表达式是直接定义在函数内部。
lambda表达式的引入,给我们编程带来了很大的便利,可以大大简化我们的编码!
3.1、lambda表达式的一般形式
lambda表达式的一般形式如下:
[capture list]( parameter list ) -> return type { function body }
其中:
1)capture list(捕获列表),是一个本表达式所在函数的局部变量的列表;
2)parameter list(参数列表),是给本lambda表达式传入的参数列表;
3)return type(返回类型),是本lambda表达式的返回值类型(可省略);
4)function body(函数体),是本lambda表达式的内部实现。
对于普通函数,返回类型位于函数开始处,但lambda表达式因为其形式,返回类型不能放在开始处,必须使用尾置的方式来指定返回类型。我们可以忽略参数列表和返回值类型,但必须包含捕获列表和函数体,比如:
auto f = [] { return 20; };
3.2、返回类型说明
直接在lambda表达式中指定返回类型,没什么问题。下面我们看看没指定返回类型时,将会发生什么。
如果lambda表达式的函数体中只包含一个return语句,如果没指定lambda表达式的返回值,则编译时会根据return语句中的内容推导出本表达式的返回值类型,比如实现两个整型数据相加的lambda表达式:
[] ( int a, int b) { return a + b; }
本lambda中没有指定函数返回类型,根据表达式(a+b)可以推断出本lambda返回值类型为int。
如果lambda表示式中不是只包含单一的return语句(多条语句),编译时编译器认定该lambda返回值类型为void。比如返回一个数绝对值的lambda如下:
[] ( int a ) { if ( a < 0) return -a; else return a; };
因为包含了多条语句,所以编译器认定该lambda返回void,编译时会报错!因为返回类型为void,却使用return返回了int类型,不一致了,所以报错!
3.3、捕获列表的规则
捕获列表,涉及到访问所在函数哪些局部变量,以及访问变量的方式。访问变量的方式主要有以引用的方式访问,还是以值的方式访问。如果是将lambda要访问的变量在捕获列表中罗列出来,则是显示捕获;如果不罗列,就是隐式捕获。
下面给出完整的捕获列表规则:
捕获类型 | 描述 |
[] | 空捕获列表。lamda表达式内部不使用所在函数中的变量。只有捕获列表不为空才能使用所在函数中的变量。 |
[names] | names是一个逗号分割的名字列表,这些名字是lamda所在函数的局部变量的名称。默认情况下,捕获列表中的变量值被拷贝,变量前面可以添加&,加&则表示采用引用捕获方式。 |
[&] | 隐式捕获列表,让编译器根据lamda内部的代码去推断使用了所在函数的哪些局部变量。采用引用捕获方式,lamda体中所使用的来自所在函数的变量都采用引用方式使用。 |
[=] | 隐式捕获列表,让编译器根据lamda内部的代码去推断使用了所在函数的哪些局部变量。采用值捕获方式,lamda体中将拷贝所使用的来自所在函数的变量的值。 |
[&, identifier_list] | identifier_list(理解为不使用&引用捕获的特例)是逗号分割的列表,包含0个或多个来自所在函数的变量,这些变量采用值捕获,identifier_list列表中的名字前面不能加&。而除identifier_list列表中指明的变量之外的任何隐式捕获的变量都采用引用捕获方式。 |
[=, identifier_list] | identifier_listt(理解为不使用=值捕获的特例)是逗号分割的列表,包含0个或多个来自所在函数的变量,这些变量采用引用捕获,identifier_list列表中的名字前面必须使用&。而除identifier_list列表中指明的变量之外任何隐式捕获的变量都采用值捕获方式。 |
关于捕获列表的例子,如下:
int main()
{int a = 0, b = 1;auto f1 = []{ return a; }; // error, 没有捕获外部变量auto f2 = [=]{ return a; }; // ok, 值传递方式捕获所有外部变量auto f3 = [=]{ return a++; }; // error, a是以赋值方式捕获的,无法修改auto f4 = [=]() mutable { return a++; }; // ok, 加上mutable修饰符后,可以修改按值传递进来的拷贝auto f5 = [&]{ return a++; }; // ok, 引用传递方式捕获所有外部变量, 并对a执行自加运算auto f6 = [a]{ return a+b; }; // error, 没有捕获变量bauto f9 = [a,&b]{ return a+(b++); }; // ok, 捕获a, &bauto f8 = [=,&b]{ return a+(b++); }; // ok, 捕获所有外部变量,&bauto f9 = [&,&b]{ return a+(b++); }; // error, 捕获所有外部变量,不能使用&b,b是特例,和默认的引用捕获不一样,使用值捕获,所以不能加&auto f10 = [=,b]{ return a+(b++); }; // error, 捕获所有外部变量,不能使用b,b是特例,和默认的值引用不一样,使用引用捕获,前面必须加&return 0;
}
3.4、可以捕获哪些变量
一般lambda表达式是放置在一个函数中的,即在函数中嵌入的,lambda函数实现体中可以访问其所在函数的局部变量。如果lambda表达式所在函数是一个类的成员函数,则lambda内部也可以访问当前函数所在的类的成员变量,这一点可能很多人不知道。比如:
class Test
{
public:int i = 0; // 类的成员变量void func(int x, int y){auto x1 = []{ return i; }; // error, 没有捕获外部变量auto x2 = [=]{ return i+x+y; }; // ok, 值传递方式捕获所有外部变量auto x3 = [=]{ return i+x+y; }; // ok, 引用传递方式捕获所有外部变量auto x4 = [this]{ return i; }; // ok, 捕获this指针auto x5 = [this]{ return i+x+y; }; // error, 没有捕获x, yauto x6 = [this, x, y]{ return i+x+y; };// ok, 捕获this指针, x, yauto x9 = [this]{ return i++; }; // ok, 捕获this指针, 并修改成员的值}
};
3.5、lambda表达式给编程带来的便利
lambda表达式的引入,给我们编程带来了很大的便利,可以大大简化我的编码。比如我们在使用STL容器的find_if、count_if、sort等算法函数时,我们要传入条件函数或者比较函数,这些函数直接用lambda表达式去实现,要方便很多。
在以前没有lambda表达式时,这些条件函数和比较函数,需要在函数外实现,要不定义成全局函数,要不定义成静态函数,甚至还要定义一些辅助的全部或者静态变量。比如有一个存放设备信息的结构体,然后有个存放设备信息的vector列表,给该列表简单的初始化一下:
// 设备信息结构体
typedef struct tagDeviceInfo
{char szDeviceId[64]; // 设备idchar szDeviceName[64]; // 设备名称int nDevType; // 设备类型public:tagDeviceInfo(){ memset(this, 0, sizeof(tagDeviceInfo)); }
}TDeviceInfo;// 设备管理类
class CDeviceManage
{CDeviceManage();~CDeviceManage();void InitDeviceList();private:vector<TDeviceInfo> m_vtDevList;
}// 初始化设备列表(仅用于测试,随意初始化了一些数据)
void CDeviceManage::InitDeviceList()
{for ( int i = 0; i < 10; i++ ){TDeviceInfo tDevInfo;char szBuf[128] = { 0 };sprintf(szBuf, "E40CF3E4-CC2B-437F-A4B9-65F2D5BD071%d", i);strcpy(tDevInfo.szDeviceId, szBuf);CUIString strName;sprintf(szBuf, "设备%d", i);strcpy(tDevInfo.szDeviceName, szBuf);m_vtDevList;.push_back(tDevInfo);}
}
假设我们在CDeviceManage::FindTest成员函数中调用STL的算法函数find_if到m_vtDevList列表中搜索设备Guid(szDeviceId)为E40CF3E4-CC2B-437F-A4B9-65F2D5BD0715的设备信息。如果不使用lambda表达式,则要将条件函数实现在CDeviceManage类外部定义成全局函数,同时要将存放目标id的变量定义成全局的,如下所示:
char* s_lpszTargetDevId = ""; // 定义成静态变量// 将条件匹配函数定义在类CDeviceManage外部,定义成全局函数
BOOL MatchFunc(TDeviceInfo& tDevInfo)
{return strcmp( s_lpszTargetDevId,tDevInfo.szDeviceId ) == 0;
}bool CDeviceManage::FindTest()
{// 对静态变量s_pTargetDevId进行赋值s_lpszTargetDevId = "E40CF3E4-CC2B-437F-A4B9-65F2D5BD0715";vector<TDeviceInfo>::iterator itor = std::find_if(m_vtDevList.begin(), m_vtDevList.end(), MatchFunc);if ( itor != m_vtDevList.end() ){// 找到对应的设备信息,进行后续处理的代码省略// ......return true;}return false;
}
上述代码实现的相对麻烦一些。
如果使用lambda表达式,代码要简洁很多,不用将条件匹配函数定义成全局函数,也不用定义静态辅助变量s_lpszTargetDevId,用lambda表达式实现的代码如下:
bool CDeviceManage::FindTest()
{char* lpszTargetDevId = "E40CF3E4-CC2B-437F-A4B9-65F2D5BD0715";vector<TDeviceInfo>::iterator itor = std::find_if(vtDevList.begin(), vtDevList.end(), [=](const TDeviceInfo& tDevInfo){return strcmp(lpszTargetDevId, tDevInfo.achDeviceId) == 0; } );// 后续代码省略// ......
}
至于为什么要使用STL的算法函数去搜索, 因为STL的算法函数的效率比较高,比直接去for循环遍历效率会高很多!如果STL列表中存放了大量的数据,数据搜索就要讲究效率了,就要使用到STL算法函数,比直接for循环变量要高上几个数量级,这点在项目中对比测试过!关于使用STL算法函数提高搜索效率的文章,可以参见我之前写的文章:
VC++调用STL算法函数有效提升STL列表的搜索速度(附源码)https://blog.csdn.net/chenlycly/article/details/123943134VC++如何使用C++ STL标准模板库中的算法函数(附源码)
https://blog.csdn.net/chenlycly/article/details/125486409
相关文章:

C++11新特性⑤ | 仿函数与lambda表达式
目录 1、引言 2、仿函数 3、lambda表达式 3.1、lambda表达式的一般形式 3.2、返回类型说明 3.3、捕获列表的规则 3.4、可以捕获哪些变量 3.5、lambda表达式给编程带来的便利 VC常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...&a…...

解决websocket不定时出现1005错误
后台抛出异常如下: Operator called default onErrorDropped reactor.core.Exceptions$ErrorCallbackNotImplemented: java.lang.IllegalArgumentException: WebSocket close status code does NOT comply with RFC-6455: 1005 Caused by: java.lang.IllegalArgume…...

文章内容生成随机图像,并将这些图像上链
一、需求背景 在当前的互联网时代,信息越来越快速地传播,一篇好的文章不仅需要有吸引人的文字内容,还需要有精美的配图。但是,对于某些只有文字,而没有图片的文章,我们可以使用程序去生成随机的图片来作为文章的配图。 本文将详细介绍如何使用Java语言实现文章内容生成…...

l8-d9 UDP通信实现
一、函数接口扩展与UDP通信实现流程 1.write/read到send/recv 函数原型: ssize_t send(int sockfd, const void *buf, size_t len, int flags); ssize_t recv(int sockfd, void *buf, size_t len, int flags); 前三个参数同read/write一样; ssize_t rea…...

MongoDB复杂聚合查询与java中MongoTemplate的api对应
MongoDB聚合json脚本 db.getCollection("202303_refund").aggregate([{"$match": {"courseType": "常规班课","teacherRefundReasonCheck": true,"teacherId": {"$in": [7544]},"createTime"…...

WireShark抓包工具的安装
1.下载安装包 在官网或者电脑应用商城都可以下载 2.安装 打开安装包,点击next 点击next 选择UI界面,两种都装上 根据习惯选择 选择安装位置点击安装 开始安装安装成功...

审计智能合约的成本是多少?如何审计智能合约?
审计智能合约的成本是多少?如何审计智能合约? 智能合约安全审计在去中心化金融 (DeFi) 生态系统中非常普遍。如果您投资了一个区块链项目,您的决定可能部分基于智能合约代码审查的结果。 虽然大多数人都了解审计对网络安全的重要性ÿ…...

9.7 校招 内推 面经
绿泡*泡: neituijunsir 交流裙 ,内推/实习/校招汇总表格 1、校招 | Momenta 2024校招火热进行中!新增招聘岗位(内推) 校招 | Momenta 2024校招火热进行中!新增招聘岗位(内推) 2、…...

【网络编程】IO多路复用
IO多路复用是一种高效的I/O处理方式,它允许单个进程能够同时监视多个文件描述符(sockets、文件等),并在其中任何一个文件描述符准备好进行I/O操作时进行处理。它的核心在于使用少量的线程或进程来管理多个I/O操作,以提…...

MySQL与postgreSQL数据库的区别
MySQL 是一个流行的开源关系型数据库管理系统,具有以下优势: 开源和免费:MySQL 是一个开源软件,允许用户免费下载、使用和修改。它的免费版本(Community Edition)提供了广泛的功能,适用于大多数…...

单片机电子元器件-按键
电子元器件 按键上有 四个引脚 1 2 、 3 4 按下之后 导通 1 3 、 2 4 初始导通 通常按键开关为机械弹性开关,开关在闭合不会马上稳定的接通,会有一连串的抖动 抖动时间的长短有机械特性来决定的,一般为5ms 到10 ms 。 消抖的分类 硬件消…...

Nacos docker实现nacos高可用集群项目
目录 Nacos是什么? Nacos在公司里的运用是什么? 使用docker构建nacos容器高可用集群 实验规划图:编辑 1、拉取nacos镜像 2、创建docker网桥(实现集群内的机器的互联互通(所有的nacos和mysql)&#x…...

基于Dubbo实现服务的远程调用
目录 前言 RPC思想 为什么使用Dubbo Dubbo技术框架 编辑 调用关系流程 基础实现 A.提供统一业务Api B.编辑服务提供者Product B.a 添加依赖 B.b 添加Dubbo 配置(基于yaml配置文件) B.c 编写并暴露服务 C.编辑服务消费者 C.a 添加依赖 C.b 添加Dubbo配置 C.c 引用…...

Redis事务的理解
介绍 Redis通过MULTI、EXEC、WATCH等命令来实现事务功能。 事务提供了一种将多个命令请求打包,然后一次性、按照顺序地执行多个命令的机制,并且在事务执行期间,服务器不会因为其他客户端请求而中断事务的执行功能,他会将事务中的…...

PostgreSQL安装异常,服务无法启动导致创建服务器超时
win上安装pg后无法创建服务器,提示创建超时,发现服务列表里面pg15服务 并没有启动,启动服务器发现服务不了,截图忘记截了,复现不了,解决方法是 换个身份,然后继续启动,然后就可以在…...

汽车电子系统网络安全解决方案
声明 本文是学习GB-T 38628-2020 信息安全技术 汽车电子系统网络安全指南. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 汽车电子系统网络安全范围 本标准给出了汽车电子系统网络安全活动框架,以及在此框架下的汽车电子系统网络安全活动…...

切片机制和MR工作机制
切片机制 默认的切片大小和块大小一致,切片的个数决定了MapTask的个数。 数据倾斜问题:如果某个切片的大小太小,会浪费了MapTask申请的CPU资源。 如果剩余数据长度大于128*1.1, 就切片成2份,否则就不进行切分了。 InputFormat基…...

【postgresql 基础入门】基础架构和命名空间层次,查看数据库对象再也不迷路
postgresql 基础架构 专栏内容: postgresql内核源码分析手写数据库toadb并发编程 开源贡献: toadb开源库 个人主页:我的主页 管理社区:开源数据库 座右铭:天行健,君子以自强不息;地势坤&…...

是的,决定放弃算法去机器学习了
可是梦想啊!~她永存心间!!! 我啊~本是执着于这些算法的怪咖,梦想是icpc,ccpc~ 可是啊~ 在以后的科研和工作中,这些算法很多都是用不到的,学习算法更重要的目的是锻炼编程能力和分析…...

Python 03(循环语句)
Python03(循环语句) 文章目录 Python03(循环语句)一、while语句二、while实现猜数字三、while循环的嵌套while循环嵌套实例需求: 四、for循环1、什么 是for循环2、语法3、执行流程4、for循环的基本使用5、range()函数6…...

安科瑞铁塔基站能耗监控解决方案
安科瑞 华楠 1 背景概述 5G发展,基站先行。5G基站的选址建设,是保证5G信号覆盖的基础,因此5G基站建设是5G产业布局的一部分,也是5G成熟的基础。 2G、3G、4G均是低频段信号传输,宏基站几乎能应付所有的信号覆盖。但由…...

操作系统-线程复用
操作系统执行线程复用的过程涉及到线程调度和管理。线程复用是指操作系统能够有效地重用现有的线程来执行新的任务,而不必每次都创建新线程。这有助于减少线程创建和销毁的开销,提高系统性能。下面是操作系统如何执行线程复用的关键步骤: 线程…...

通达信自定义副图行业指标K线指标 HYZS_QD
行业指数:HY_INDEXC,NODRAW; DRAWKLINE(HY_INDEXH,HY_INDEXO,HY_INDEXL,HY_INDEXC); MA5:MA(HY_INDEXC,5),COLORWHITE; {MA10:MA(HY_INDEXC,10),COLORYELLOW,LINETHICK2}; DRAWTEXT_FIX(1,1,1,1,STRCAT(STRCAT(CON2STR(HY_INDEXADV,0),/),STRCAT(CON2STR(HY_INDEXDEC,0), ))),…...

MDK-Keil AC6 Compiler屏蔽特定警告
最近在使用STM32CubeMX生成MDK工程是,使用了 AC6 版本的编译器进行编译代码,然后发现了一些警告,但是在 AC5 版本下编译又正常。于是研究了下怎么屏蔽特定的警告,这里记录一下。 1. Keil AC6屏蔽特定警告 遇到的警告如下&#x…...

计算机网络的故事——了解Web及网络基础
了解Web及网络基础 文章目录 了解Web及网络基础一、使用 HTTP 协议访问 Web二、HTTP 的诞生三、网络基础 TCP/IP四、与 HTTP 关系密切的协议 : IP、TCP 和 DNS 一、使用 HTTP 协议访问 Web 根据Web浏览器指定的URL,从对应的服务器中获取文件资源,从而显…...

[系统安全] 五十三.DataCon竞赛 (2)2022年DataCon涉网分析之恶意样本IOC自动化提取详解
您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列。因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全、逆向分析和恶意代码检测,“系统安全”系列文章会更加聚焦,更加系…...

自动驾驶——估计预瞄轨迹YawRate
1.Introduction 在ADAS控制系统中,通常根据预瞄距离x去估计横向距离y,有如下关系: y a0 a1 x a2 * x^2 a3 * x^3 ,那么现在有个需求,希望根据上述x和y的关系,去估计规划预瞄轨迹yawRate 2.How to es…...

PMP证书考下来要多少费用?
PMP考试共有三项费用:分为考前费用、考后费用和续证费用。 第一项是考前费用: 1、培训费用,在英文报名时需要填写培训公司名称和35学时的培训证明。一般的培训公司收费不一,有些公司大概是三千元左右,而有些公司可能…...

C动态分配
动态分布与静态发布: 静态分配 1、 在程序编译或运行过程中,按事先规定大小分配内存空间的分配方式。int a [10] 2、 必须事先知道所需空间的大小。 3、 分配在栈区或全局变量区,一般以数组的形式。 4、 按计划分配。 动态分配 1、在程序运…...

C语言——程序环境和预处理(再也不用担心会忘记预处理的知识)
了解程序环境和预处理 前言:一、程序环境二、编译链接2.1 翻译环境2.2 编译的几个阶段2.3 运行环境 三、预处理3.1 预定义符号3.2. #define的使用3.2.1 #define 定义标识符3.2.2 #define 定义宏3.2.3 #define 替换规则3.2.4 #和##的用途3.2.5 带副作用的宏参数3.2.6…...