【C++11重点语法】lambda表达式,初始化列表

news2024/11/25 4:21:05

目录

引子:C++11为什么的源来

语法1:初始化列表 

        1.2.2 多个对象的列表初始化

语法3:默认成员函数控制(delete,default)

语法4:lambda表达式 


引子:C++11为什么的源来

在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了C++98称为 C++11之前的最新C++标准名称。打算5年一个标准,打算07年出一个新标准,但是没有完成,把C++07改名叫C++0x,直到11年完成改名问C++11;相比于C++98/03,C++11则带来了数量可观的变化,其中包含了约140个新特性,以及对C++03标准中约600个缺陷的修正,有很多新东西,其中也有许多鸡肋语法;C++11能更好地用于系统开发和库开发、语法更加泛华和简单化、更加稳定和安全,不仅功能更强大,而且能提升程序员的开发效率

语法1:初始化列表 

1.1内置类型的初始化列表

  • 可以使用‘=’
int main()
 { 
 // 内置类型变量
 int x1 = {10};
 int x2{10};
 int x3 = 1+2;
 int x4 = {1+2};
 int x5{1+2};
 // 数组
 int arr1[5] {1,2,3,4,5};
 int arr2[]{1,2,3,4,5};
 
 // 动态数组,在C++98中不支持
 int* arr3 = new int[5]{1,2,3,4,5};
 
 // 标准容器
 vector<int> v{1,2,3,4,5};
 map<int, int> m{{1,1}, {2,2,},{3,3},{4,4}};
 return 0;
 }

 1.2自定义类型的列表初始化

1.2.1. 标准库支持单个对象的列表初始化

  • 多参数构造函数,支持隐式类型转换
class Point
{
public:
 Point(int x = 0, int y = 0): _x(x), _y(y)
 {}
private:
 int _x;
 int _y;
};
int main()
{
 Pointer p{ 1, 2 };
 return 0;
}

1.2.2 多个对象的列表初始化

C++98支持数组使用列表初始化 ,C++98不支持构造函数列表初始化  

int array1[] = {1,2,3,4,5};
int array2[5] = {0};

C++支持构造函数列表初始化  

vector<int> v{1,2,3,4,5};

原因:1,2,3,4,5,先隐式构造为initializer_list的一个对象,再调用vector对应的构造函数

容器vector的 initializer_list 构造函数和赋值运算符重载

  • initializer_list是系统自定义的类模板,该类接口函数:迭代器 :begin()、end()以及获取区间中元素个数的方法size()
  • 多个对象想要支持列表初始化,需给该类(模板类)添加一个带有initializer_list类型参数的构造函数;
		Vector(initializer_list<T> l)
			 : _capacity(l.size())
			 , _size(0)
		{
			_array = new T[_capacity];
			for (auto e : l)
				_array[_size++] = e;
		}

		Vector<T>& operator=(initializer_list<T> l) 
		{
			delete[] _array;
			size_t i = 0;
			for (auto e : l)
				_array[i++] = e;
			return *this;
		}

 C++11扩大了用大括号括起的列表(初始化列表)的使用范围,使其可用于所有的内置类型(vector,list)和用户自定义的类型,使用初始化列表时,可添加等号(=),也可不添加。 

语法2:decltype类型推导

  • 不知道对象或者返回值的类型,decltype是根据表达式的实际类型推演出定义变量时所用的类型
    const int x = 2;
	const int y = 3;
	decltype(x+y) z = 3;
	cout << typeid(z).name() << endl;

 语法3:默认成员函数控制(delete,default)

1.default:显式缺省函数 

  • 默认成员函数都可以使用default

写了拷贝构造函数就不会默认生成构造函数了,就没办法创造一个无参的对象了 

class Person
{
public:
    //person()=default;
	Person(const char* name,int age)
		:_name(name)
		,_age(age)
	{}
private:
	string _name;
	int _age=0;
};
int main()
{
	Person p;
	return 0;
}

person()=default ;这句代码就可以让编译器默认生成;

2.delete:删除默认函数,没有办法真正删除,只是不让删除使用

C++98 防拷贝:1、只声明不实现 2、声明成私有 

class A
{
public:
	A() = default;

private:
	A(const A& a);
};
  1. 只声明不实现 ,调用也不会发生改变
  2.  声明成私有,防止在类外被声明

 C++11:使用A(const A& a)=delete即可

class A
{
public:
	A() = default;

    A(const A& a)=delete;
private:

};

语法4:lambda表达式 

这里有一组数据,按名称或者按数量,要怎么办了;

pair<string,int> fruit[] = { {"香蕉",15}, {"菠萝",23},{"柿子",35}, {"芒果",12} };

使用仿函数 

class compareName
{
public:
	bool operator()(const pair<string, int>& l, const pair<string, int>& r)
	{
		return l.first <= r.first;
	}
};
class compareNumber
{
public:
	bool operator()(const pair<string,int>& l, const pair<string, int>& r)
	{
		return l.second <= r.second;
	}
};
int main()
{
	pair<string,int> fruit[] = { {"香蕉",15}, {"菠萝",23},{"柿子",35}, {"芒果",12} };
	sort(fruit, fruit+ 4, compareNumber());
	for (int i = 0; i < 4; i++)
	{
		cout << fruit[i].second << " ";
	}
	cout << endl;
	sort(fruit, fruit + 4, compareName());
	for (int i = 0; i < 4; i++)
	{
		cout << fruit[i].first << " ";
	}
}

每次为了实现一个algorithm算法, 都要重新去写一个类,如果每次比较的逻辑不一样,还要去实现多个类,特别是相同类的命名,这些都给编程者带来了极大的不便;

使用lambda表达式代码就会简短一些

	pair<string,int> fruit[] = { {"香蕉",15}, {"菠萝",23},{"柿子",35}, {"芒果",12} };
    //数量比较
	sort(fruit, fruit + 4, [](const pair<string, int>& l, const pair<string, int>& r)->bool
													{ return l.second <= r.second; });
	for (int i = 0; i < 4; i++)
	{
		cout << fruit[i].second << " ";
	}
	cout << endl;
    //名字比较
	sort(fruit, fruit + 4, [](const pair<string, int>& l, const pair<string, int>& r)->bool 
														{ return l.first <= r.first;});
	for (int i = 0; i < 4; i++)
	{
		cout << fruit[i].first << " ";
	}

lambda表达式结构 

lambda表达式语法:

  1. 参数列表。与普通函数的参数列表一致,如果不需要参数传递,则可以连同()一起省略 
  2. mutable:默认情况下,lambda函数捕捉的是一个const变量,mutable可以取消其常量性使用该修饰符时,参数列表不可省略(即使参数为空),
  3. ->返回值:返回值类型。用追踪返回类型形式声明函数的返回值类型,没有返回值时此部分可省略返回值类型明确情况下,也可省略,由编译器对返回类型进行推导
  4. 函数体:在该函数体内,除了可以使用其参数外,还可以使用所有捕获到的变量

 最简单的一个lambda表达式:[]{};

捕捉列表:该列表总是出现在lambda函数的开始位置,编译器根据[]来判断接下来的代码是否为lambda函数,捕捉列表能够捕捉上下文中的变量供lambda函数使用。

    int a = 10;
	int b = 20;
	auto Add = [a, b] {return a + b; };
	cout<<Add();

输出:30; 

5种捕捉:所有捕捉的变量都是被const修饰的;加mutable就取消了常性

  • [var]:表示  值传递方式捕捉变量;例int a=10;int b=20;[a,b]{return a+b;};
  • var [=]:表示  值传递方式捕获所有父作用域中的变量(包括this)例int a=10;int b=20;[a,b]{return a+b;};
  • [&var]:表示  引用传递捕捉变量var;例int a=10;int b=20;[&a,&b]{int tmp=a;a=b;b=tem;     return a+b;};(引用才可以交换,值传递(拷贝)不可以交换)
  • [&]:表示  引用传递捕捉所有父作用域中的变量(包括this)
  • [this]:表示  值传递方式捕捉当前的this指针

实际在底层编译器对于lambda表达式的处理方式,完全就是按照函数对象的方式处理的,只是简短仿函数的写法;

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]计算机毕业设计springboot课室预约系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

用户体验设计笔记(1-1)

前言 ☔️只考虑体验的商业不可持续&#xff0c;只考虑商业的体验没有底线。         ☔️用户体验就是用户使用产品过程中积累起来的主管体验总和。 1 丨商业的天时&#xff1a;如何选择正确的体验策略&#xff1f; ☔️任何产品与服务&#xff0c;都是从用户场景的商业规…

小项目应该如何进行跨平台方案选型

作为一个小开发&#xff0c;近期完整的经历了&#xff0c;一个初创项目从搭建到推向市场的过程。实际上在整个过程中&#xff0c;开发只占很小的一个板块&#xff0c;尤其是对于我司这种初创型企业&#xff0c;人少钱少&#xff0c;每一分都得花到刀刃上&#xff0c;因此产品开…

新零售行业如何玩转线上服务

如今&#xff0c;随着市场的千变万化&#xff0c;企业的商业模式正在不断经历革新。如线上企业不再单纯走电商路线&#xff0c;纷纷进军线下卖场&#xff0c;而传统门店也在寻找线上突围的机会&#xff0c;通过与电商平台合作&#xff0c;开启线上专卖店。线上线下相结合的新零…

WebDAV之葫芦儿·派盘+静读天下

静读天下 支持webdav方式连接葫芦儿派盘。 如今,很多人都喜欢在手机上进行阅读,所以想要获得更好的阅读体验,一款实用的电子书就显得尤为重要了,因此,静读天下这款纯正的本地电子书阅读软件您值得拥有,而且还支持本地电子书备份到葫芦儿派盘。 静读天下是一款备受千万…

实例方法(instance method)、类方法、构造方法(三)

实例方法&#xff08;没有static&#xff09;的概念 对象被称为实例。实例相关的有&#xff1a;实例变量、实例方法。实例变量是对象变量。实例方法是对象方法。实例方法没有static。&#xff08;对象方法&#xff0c;对象级别的方法&#xff09; 实例方法的调用需要先new一个…

详解设计模式:桥接模式

桥接模式&#xff08;Bridge Pattern&#xff09;也称为桥梁模式、接口模式或者柄体模式&#xff0c;有点像适配器模式&#xff0c;也是 GoF 的 23 种设计模式中的一种结构型设计模式。 桥接模式 是用于把抽象化与实现化解耦&#xff0c;使得二者可以独立变化。这种类型的设计模…

【算法基础】双指针

一、最长连续不重复子序列 给定一个长度为 n 的整数序列&#xff0c;请找出最长的不包含重复的数的连续区间&#xff0c;输出它的长度。 输入格式 第一行包含整数 n。 第二行包含 n 个整数&#xff08;均在 0∼105 范围内&#xff09;&#xff0c;表示整数序列。 输出格式 …

azkaban表project_flows数据分析

project_flows表中数据是怎么存入进去的呢,其中有个JSON字符串是乱码,怎么设置的呢?搜索插入语句地方如下: 查看压缩类型,2为Gzip压缩 public enum EncodingType {PLAIN(1), GZIP(2); 查看flow.toObject方法,其实返回的是一个MAP,定义如下: 查看convertJsonToBytes方…

【毕业设计】20-基于单片机的指纹识别系统设计(原理图工程+源代码工程+实物操作图+答辩论文+答辩PPT)

typora-root-url: ./ 【毕业设计】20-基于单片机的指纹识别系统设计&#xff08;原理图工程源代码工程实物操作图答辩论文答辩PPT&#xff09; 文章目录typora-root-url: ./【毕业设计】20-基于单片机的指纹识别系统设计&#xff08;原理图工程源代码工程实物操作图答辩论文答…

anaconda ( jupyter notebook ) 虚拟环境安装 lazypredict

安装lazypredict 点击 Anaconda Prompt 1.创建虚拟环境 conda create -n py3.9 python3.92.激活虚拟环境 conda activate py3.93.安装lazypredict pip3 install lazypredict0.2.7 numpy pandas tqdm scikit-learn xgboost lightgbm4.安装ipykernel &#xff08;第一次导入…

SpringBoot3.0正式发布,我来尝尝鲜

GraalVM 版本&#xff1a;graalvm-ce-java17-22.3.0 SpringBoot3.0 中最重要的特性就是对 GraalVM 的支持&#xff0c;从而达到更快的启动速度&#xff0c;有两种使用方式。 利用 GraalVM 构建可执行文件 因为需要利用 GraalVM 来打包可执行文件&#xff0c;所以需要你的机器上…

bestphp‘s revenge/ 安洵杯Babyphp(phpsession题目)

目录 [LCTF]bestphp‘s revenge 一.SoapClient 二.CRLF Injection漏洞 简单来说就是&#xff0c;“回车换行”&#xff08;\r\n)的简称。 三、call_user_func 四、PHPsession反序列化 安洵杯Babyphp 第一步 第二步 第三步 最后 [LCTF]bestphp‘s revenge 一.SoapCl…

基于docker创建mysql容器

基础环境 Server: Docker Engine - CommunityEngine:Version: 20.10.9选择镜像 好用、可靠 不好用&#xff1a;DOCKER OFFICIAL IMAGE mysql 好用&#xff1a; VERIFIED PUBLISHER bitnami/mysql 部署容器 创建桥接网络 docker network create app-tier --drive…

java 把a.txt文件中的内容复制到当前项目目录下的b.txt文件中,2种方式比较复制效率 毫秒比较

java 把a.txt文件中的内容复制到当前项目目录下的b.txt文件中&#xff0c;2种方式比较复制效率 毫秒比较 package xxx;import java.io.*; public class JavaApplication1 {public static void main(String[] args) throws IOException {long start System.currentTimeMillis(…

[附源码]Python计算机毕业设计Django第三方游戏零售平台

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

手把手教你写一个Vue3组件库但是乞丐版

好久没写文章了&#xff0c;最近在研究一些组件库的实现方法&#xff0c;分享一下。在这我这篇文章之前其实已经有一篇文章讲了Vue如何打包组件库了&#xff08;最底部&#xff09;&#xff0c;但是这篇文章一是没有源码二是Vue3和Vue2的组件库写法有点不一样&#xff0c;关于这…

数据挖掘-理论与算法 公开课笔记

1.1.1.1 整装待发 近年来数据存储和数据处理的能力都产生了飞跃&#xff0c;为数据挖掘奠定了基础。虽然数据量大&#xff0c;但是真正有用的信息少 2.1.2.1 学而不思则罔 是多学科&#xff08;机器学习、人工智能、模式识别、统计学&#xff09;的交叉领域如何学习数据挖掘&…

【分布式能源的选址与定容】基于非支配排序多目标粒子群优化算法求解分布式能源的选址与定容附Matlab代码

​✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法…

【HDU No. 1166】 敌兵布阵

【HDU No. 1166】 敌兵布阵 杭电 OJ 题目地址 【题意】 A国在海岸线沿直线布置了N 个工兵营地。C国通过先进的监测手段对A国每个工兵营地的人数都掌握得一清二楚。每个工兵营地的人数都可能发生变动&#xff0c;可能增加或减少若干人手。 【输入输出】 输入&#xff1a; 第…