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

news2024/11/26 12:14:21

目录

引子: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/50304.html

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

相关文章

22年11月-外包-面试题

目录背景题目Spring怎么解决循环依赖&#xff1f;什么是循环依赖第一种&#xff1a;互相依赖第二种&#xff1a;三者间依赖第三种&#xff1a;自我依赖三级缓存补充&#xff1a;那第三级缓存的作用是什么&#xff1f;补充&#xff1a;Spring 中哪些情况下&#xff0c;不能解决循…

【Hadoop】在云服务器上部署Hadoop2.7.1伪分布式集群

文章目录一、准备Hadoop压缩包并安装1、安装Hadoop&#xff08;1&#xff09;准备好hadoop压缩包&#xff08;2&#xff09;安装hadoop&#xff08;3&#xff09;查看是否安装成功2、将hadoop添加到环境变量&#xff08;1&#xff09;在文件末尾添加以下内容&#xff08;2&…

怎样图片转文字?两分钟让你实现快速转文字

在日常的办公中&#xff0c;我们经常会遇到需要将纸质文件里的文字提取出来&#xff0c;再转换为电子档的情况&#xff0c;如果我们采用手动输入的话&#xff0c;不仅速度太慢&#xff0c;而且还可能因此耽误到后边的工作&#xff0c;是不是已经有小伙伴遇到这种现象&#xff0…

[附源码]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;…

[附源码]计算机毕业设计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…

RFC(Remote function call)

文章目录1 Definition2 Call process3. Communication4 Communication module5 RFC version .6 RFC and Web service7 Remote object maintain8 Call RFC1 Definition 2 Call process 3. Communication 4 Communication module 5 RFC version . 6 RFC and Web service 7 Remote…

mysql的主从复制

文章目录前言主备原理binlog的三种格式循环复制问题主备的搭建总结前言 mysql在日常中的使用是比较多的&#xff0c;大部分可能也都搭建过主从复制&#xff0c;或者集群模式。但是其中的原理不知道大家是否清楚。今天我们主要介绍的就是mysql主从复制的原理。 主备原理 主备…

Transformer对接公司需求的调研报告

1. 结构 从宏观的视角开始 首先将这个模型看成是一个黑箱操作。在机器翻译中&#xff0c;就是输入一种语言&#xff0c;输出另一种语言。 那么拆开这个黑箱&#xff0c;我们可以看到它是由编码组件、解码组件和它们之间的连接组成。 编码组件部分由一堆编码器&#xff08;enc…

Open vSwitch系列之数据结构解析深入分析ofpbuf

上一篇我们分析了hmap&#xff0c;hamp可以说是Open vSwitch中基石结构&#xff0c;很多Open vSwitch中数据结构都依赖hmap。本篇我们来分析一下ofpbuf&#xff0c;这个结构&#xff0c;我们从名字上就可得知&#xff0c;此数据结构用于存储数据的&#xff0c;比如收发OpenFlow…

1543_AURIX_TC275_CPU子系统_CPU内核实现特性

全部学习汇总&#xff1a; GreyZhang/g_TC275: happy hacking for TC275! (github.com) 这个章节看的信息应该是针对内核设计实现上TC275的具体实现特点&#xff0c;应该是覆盖了很多内核中的实施相关的特性的。 1. 在上下文功能支持上&#xff0c;P和更灵活一些。E核只支持DSP…

[附源码]Python计算机毕业设计SSM辽宁科技大学二手车交易平台(程序+LW)

项目运行 环境配置&#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…

非常强,批处理框架 Spring Batch 就该这么用!(场景实战)

前言 概念词就不多说了&#xff0c;我简单地介绍下 &#xff0c; spring batch 是一个 方便使用的 较健全的 批处理 框架。 为什么说是方便使用的&#xff0c;因为这是 基于spring的一个框架&#xff0c;接入简单、易理解、流程分明。 为什么说是较健全的&#xff0c; 因为它…

NVIDIA 7th SkyHackathon(八)使用 Flask 与 Vue 开发 Web

1.页面效果 Web 采用 flaskvue 开发&#xff0c;效果图如下 2.后端 import sys import subprocess import os from PIL import Image from datetime import datetime from ASR_metrics import utils as metricsfrom werkzeug.wrappers import Request, Response from …

卡尔曼滤波:过滤随机游走

本文是Quantitative Methods and Analysis: Pairs Trading此书的读书笔记。 我们知道&#xff0c;随机游走序列是到当前时间为止白噪声实现(white noise realization)的简单求和。换句话说&#xff0c;随机游走序列中的对下一个时间点值的估计&#xff08;预测&#xff09;是通…

为什么程序员买不起房子?

很多人都说程序员的收入那么高&#xff0c;为什么程序员还是买不起房呢&#xff1f;其实不是程序员不想买&#xff0c;是真的买不起…… 拿北京为例。北京的房价可谓是越来越奇葩&#xff0c;不仅仅是因为银行政策导致贷款越来越难审批下来&#xff0c;更重要的是进入地产市场…

音频3A算法详解

一、音频3A技术背景 手机电脑等智能设备的普及,AI智能、5G等技术的不断发展,语音通信成为了最方便快捷的远程交流方式,会议全向麦克风、会议一体化终端等会议系统逐渐成为企业经营中的重要工具。语音质量决定了企业远程沟通协作效果,其中噪音和回声能够严重影响到语音预处理…

图扑软件获评 2022 年“火炬瞪羚企业”

厦门火炬高新区 2022 年“火炬瞪羚企业”名单公布&#xff0c;图扑软件经过层层遴选&#xff0c;成功入围&#xff0c;获评 2022 年“火炬瞪羚企业”称号。 在 2021 年&#xff0c;图扑软件已经凭借领先的技术实力和发展潜力&#xff0c;入选福建省数字经济领域“瞪羚”创新企业…

连续学习入门(二):连续学习的三种类型

说明&#xff1a;本系列文章若无特别说明&#xff0c;则在技术上将 Continual Learning&#xff08;连续学习&#xff09;等同于 Incremental Learning&#xff08;增量学习&#xff09;、Lifelong Learning&#xff08;终身学习&#xff09;&#xff0c;关于 Continual Learni…

Express操作MongoDB【一.Express框架通过Mongoose模块操作MongoDB数据库;二.在接口中间件中使用Mongoose模块】

目录 一.Express框架通过Mongoose模块操作MongoDB数据库 1.MongoDB数据库&#xff1a; &#xff08;1&#xff09;存放数据的格式&#xff1a;key:value &#xff08;2&#xff09;数据库&#xff08;database&#xff09;---集合&#xff08;collection&#xff09;---文档…

使用vite 搭建vue 3的项目

一、目标&#xff1a; 使用vite搭建一个Vue 3 的项目&#xff0c;并启动成功。 二、准备工作 首先你要有Node.js、VSCode编辑器、Chrome浏览器 关于下载的问题Node.js可以去官网下载 链接&#xff1a;http://nodejs.cn/download/ 下载左边的长期支持版本就好&#xff0c;最新版…