C++【C++11】

news2024/11/18 9:26:08

文章目录

  • 一、统一的列表初始化
    • 1.用{}来初始化元素
    • 2.initializer_list
  • 二、自动类型推断
    • 3.auto
    • 4.decltype
  • 三、指针
    • 5.nullptr
    • 6.范围for
  • 四、STL中的一些新变化
    • 1.新增加的容器
    • 2.容器内部的变化

一、统一的列表初始化

1.用{}来初始化元素

在C++98中,标准允许使用花括号{}对数组或者结构体元素进行统一的列表初始值设定。比如:

struct Point
{
	int _x;
	int _y;
};
int main()
{
	int array1[] = { 1, 2, 3, 4, 5 };
	int array2[5] = { 0 };
	Point p = { 1, 2 };
	return 0;
}

但是在C++11中,我们都可以使用{}来对我们的元素进行初始化
C++11扩大了用大括号括起的列表(初始化列表)的使用范围,使其可用于所有的内置类型和用户自定义的类型,使用初始化列表时,可添加等号(=),也可不添加

#include <iostream>
#include <vector>
#include <list>
#include <map>
#include <set>
#include <array>
using namespace std;

class Date
{
public:
	Date(int year, int month, int day)
		:_year(year)
		, _month(month)
		, _day(day)
	{
		cout << "Date(int year, int month, int day)" << endl;
	}

private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	int x1 = 1;
	// 要能看懂,但是不建议使用
	int x2 = { 2 };
	int x3 { 2 };
	
	// 都是在调用构造函数
	Date d1(2022, 11, 22);
	// C++11 要能看懂,但是不建议使用
	Date d2 = {2022, 11, 11}; // ->调用构造函数
	Date d3{ 2022, 11, 11 };
	return 0;
}

在这里插入图片描述

2.initializer_list

C++11中有了一种新的类型,initializer_list,语法上原生支持通过大括号的方式初始化给它。它就像一个顺序表一样,支持迭代器,但是不支持插入数据。
在这里插入图片描述

int main()
{
	// 调用支持list (initializer_list<value_type> il)类似这样的构造函数
	vector<int> v1 = { 1, 2, 3, 4, 5, 6 };
	vector<int> v2 { 1, 2, 3, 4, 5, 6 };

	list<int> lt1 = { 1, 2, 3, 4, 5, 6 };
	list<int> lt2{ 1, 2, 3, 4, 5, 6 };

    //c++11这里新增了一个类型initializer_list类型来实现,是这里默认需要的一个容器
	auto x = { 1, 2, 3, 4, 5, 6 };
	cout << typeid(x).name() << endl;
	return 0;
}

在这里插入图片描述
那我们的vector等容器又是如何支持大括号的初始化的呢?
因为我们的C++11同时也对我们的库函数进行了更新,让我们的库函数都支持通过initializer_list来进行构造。
这里我们查看一下vector的构造函数中多了一个构造方法,也就是我们的initializer
在这里插入图片描述
在这里插入图片描述
那如何让我们自己之前写过的vector支持通过initializer来初始化

vector(initializer_list<T> il)
                :_start(nullptr)
                ,_finish(nullptr)
                ,_end_of_storage(nullptr)
        {
            reserve(il.size());
            iterator it=begin();
            for(auto&e:il)
            {
                push_back(e);
            }
            
        }

测试代码

void myvector_test18()
    {
        vector<int> v1={1,2,3,4,5,6,7,8,9,10};
        vector<int> v2{1,2,3,4,5,6,7,8,9,10};
        for(auto e:v2)
        {
            cout<<e<<" ";
        }
        cout<<endl;
    }

在这里插入图片描述

当然,我们的map,set,pair等容器也可以通过这种方式进行构造

#include <iostream>
#include <vector>
#include <list>
#include <map>
#include <set>
#include <array>
using namespace std;

class Date
{
public:
	Date(int year, int month, int day)
		:_year(year)
		, _month(month)
		, _day(day)
	{
		cout << "Date(int year, int month, int day)" << endl;
	}

private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Date d1(2022, 11, 22);
	Date d2 = {2022, 11, 11}; 
	Date d3{ 2022, 11, 11 };

	vector<Date> v3 = {d1, d2, d3};
	vector<Date> v4 = { { 2022, 1, 1 }, {2022, 11, 11} };

	string s1 = "11111";

	// 构造
    //这相当于就是隐式类型转换
    //构造一个pair我们也可以通过{}的方式构造
	map<string, string> dict = { { "sort", "排序" }, { "insert", "插入" } };

	return 0;
}

在这里插入图片描述
当然在我们的C++11的库中,还将许多赋值也进行了重载,让其能够支持initializer进行赋值
在这里插入图片描述
下面是我们的测试代码

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

int main()
{
	// 构造
    //这相当于就是隐式类型转换
    //构造一个pair我们也可以通过{}的方式构造
	map<string, string> dict = { { "sort", "排序" }, { "insert", "插入" } };

	// 赋值重载
	//这里不写auto让编译器自动去推断,我们的编译器是没有办法匹配出来的。
	initializer_list<pair<const string, string>> kvil = { { "left", "左边" }, { "left", "左边" } };
	dict = kvil;

	return 0;
}

总结:
C++11之后,一切对象都可以用列表初始化。但是我们建议普通对象还是用以前的方式初始化,容器可以采用花括号进行初始化。

二、自动类型推断

3.auto

在C++98中auto是一个存储类型的说明符,表明变量是局部自动存储类型,但是局部域中定义局部的变量默认就是自动存储类型,所以auto就没什么价值了。C++11中废弃auto原来的用法,将其用于实现自动类型推断。这样要求必须进行显示初始化,让编译器将定义对象的类型设置为初始化值的类型。

int main()
{
    int i = 10;
    auto p = &i;
    auto pf = strcpy;
    cout << typeid(p).name() << endl;
    cout << typeid(pf).name() << endl;
    map<string, string> dict = { {"sort", "排序"}, {"insert", "插入"} };
    //如果我们这里要自己写的话,需要写一长串,但是使用auto的话就非常方便
    //map<string, string>::iterator it = dict.begin();
    auto it = dict.begin();
    return 0;
}

如果我们这里使用auto的话,我们上面代码中的迭代器的类型等等,我们都不用自己手写,就非常方便,但是我们如果使用了auto进行自动类型推断,我们代码的可读性就会变差,但是有些编译器会给你标识出来(比方说clion)。
在这里插入图片描述

4.decltype

typename可以推导对象的类型,但是我们不能通过这个推导出来的类型来定义我们的对象,只是单纯地拿到这个类型的字符串。
但是如果我们想要用推导出来的类型重新定义一个新的对象呢?

int main()
{
	int x = 10;

	// typeid拿到只是类型的字符串,不能用这个再去定义对象什么的
    // 下面这样写会报错的,没有下面这样的用法
    //	typeid(x).name() y = 20;
	decltype(x) y1 = 20.22;
    //auto和decltype是不一样的,我们的auto这里推导出来的是double,也就是我们右边的赋值的元素的类型是什么,我们auto推导出来也就是什么
    //但是我们的deltype推导出来的类型是x的类型,也就是int
	auto y2 = 20.22;

	cout << y1 << endl;
	cout << y2 << endl;

	return 0;
}

在这里插入图片描述

三、指针

5.nullptr

由于C++中NULL被定义成字面量0,这样就可能会带来一些问题,因为0既能指针常量,又能表示整形常量。所以出于清晰和安全的角度考虑,C++11中新增了nullptr,用于表示空指针。

#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif

6.范围for

这里的范围for和我们java中的增强for有些相似,底层是一个迭代器。
可以查看我们之前的博客中的迭代器和范围for相关的部分

int main()
{
    vector<int> tmp{1,2,3,4,5,6,7,8,9};
    for(auto i:tmp)
    {
        cout<<i<<" ";
    }
    cout<<endl;
}

在这里插入图片描述

四、STL中的一些新变化

1.新增加的容器

在这里插入图片描述
< array >和< forward_list >显得有些鸡肋
因为< array >是固定大小的数组容器,不支持尾插和尾删,支持[]迭代器。
C++11增加这个的初衷是为了替代c语言中的数组

int main()
{
	const size_t N = 100;
	int a1[N];

	// C语言数组越界检查,越界读基本检查不出来,越界写是抽查
	a1[N];
	//a1[N] = 1;
	a1[N+5] = 1;


	// 越界读写都可以被检查出来
	// 实际情况:array用得很少,一方面大家用c数组用惯了
	// 用array不如用vector + resize去替代c数组

	array<int, N> a2;
	a2[N];
	a2[N] = 1;
	a2[N + 5] = 1;

	return 0;
}

< forward_list >是一个单链表,我们的< list >是双向链表,在使用的时候其实< forward_list >插入的是在我们当前指定位置的后一个位置插入,然后erase并不是擦除当前的位置,而是擦除当前位置的下一个位置

2.容器内部的变化

1.都支持了initializer_list构造,用来支持列表初始化
2.比较鸡肋的接口,比如cbegin,cend系列
3.移动构造和移动赋值,用来对标拷贝构造和拷贝赋值,在某些场景下可以提高效率
(set&&x);
(set& operator=(set&&x)
4.右值引用的参数的插入
在这里插入图片描述

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

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

相关文章

搭建java部署环境以及部署Web项目到Linux

系列文章目录 Linux 环境搭建以及xshell远程连接_crazy_xieyi的博客-CSDN博客 Linux常用命令详解_crazy_xieyi的博客-CSDN博客 Linux权限_crazy_xieyi的博客-CSDN博客 文章目录 一、搭建java部署环境 1.yum 2.JDK 3.Maven 4.Tomcat 5.MySQL二、部署…

PacBio三代全长扩增子测序对珊瑚共生虫黄藻和细菌群落进行精确分类

研究背景 珊瑚与其共生微生物群落统称为珊瑚共生功能体&#xff0c;包含了光合甲藻以及与其保持长期互利共生关系的细菌、古菌、真菌、原生动物以及病毒等一系列微生物。这些与珊瑚相关的微生物在其宿主的适应性和生存中起着重要的作用。本研究利用PacBio全长16S rRNA和ITS测序…

【Spring】一文带你吃透Spring集成MyBatis

个人主页&#xff1a; 几分醉意的CSDN博客_传送门 文章目录&#x1f496;Spring集成MyBatis✨怎么使用mybatis✨集成的步骤✨创建数据库表✨pom加入依赖✨创建MyBatis使用代码✨创建Service类✨创建Spring配置文件✨测试集成MyBatis✨使用外部属性配置文件&#x1f496;投票传送…

HTML西安旅游网页设计作业成品 大学生旅游风景区网页设计作业模板下载 静态HTML旅游景点网页制作下载 DW网页设计代码

&#x1f468;‍&#x1f393;学生HTML静态网页基础水平制作&#x1f469;‍&#x1f393;&#xff0c;页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码&#xff0c;这是一个不错的旅游网页制作&#xff0c;画面精明&#xff0c;排版整洁&#xff0c;内容…

Redis主从复制

安装redis 下载redis源码: wget http://download.redis.io/releases/redis-3.2.3.tar.gz 解压安装redis&#xff1a; tar zxf redis-3.2.3.tar.gz 解压完毕后开始安装&#xff0c;如下&#xff1a; cd redis-3.2.3/ make&&make install 然后再切换到utils目录下&…

【LeetCode每日一题:792.匹配子序列的单词数~~~时间超限的双指针+改进优化的存储元素位置的二分查找】

题目描述 给定字符串 s 和字符串数组 words, 返回 words[i] 中是s的子序列的单词个数 。 字符串的 子序列 是从原始字符串中生成的新字符串&#xff0c;可以从中删去一些字符(可以是none)&#xff0c;而不改变其余字符的相对顺序。 例如&#xff0c; “ace” 是 “abcde” 的…

进程的通信 - 剪切板

剪切板是系统维护管理的一块内存区域&#xff0c;本机的所有进程都可以访问。当一个进程复制数据时&#xff0c;先将数据放在该内存区&#xff0c;当另一个进程粘贴时&#xff0c;则是从该内存区块取出数据 剪切板操作&#xff1a; 其实在剪切板中也就那几个API在使用&#x…

CEF 桌面软件开发实战

作者介绍 刘晓伦liulun&#xff0c;资深桌面端开发工程师。目前在一家大型国有控股上市公司任职&#xff0c;主要负责桌面端产品的核心技术研发、重难点技术攻关&#xff0c;以及新技术的预研和技术储备工作&#xff0c;拥有十几年的软件开发经验&#xff0c;在 Electron 、 Qt…

湖南郴州知心世界岛主王瑞平将出新书《知心世界》谷传民为其顾问

最近几天&#xff0c;被谷传民起诉的大衣哥&#xff0c;终于又满血复活&#xff0c;他也通过网络给知心世界岛主王瑞平送去了祝福。 就在农民歌唱家大衣哥&#xff0c;给知心世界岛主王瑞平&#xff0c;送去真挚的祝福不久&#xff0c;著名导演谷传民那边也有了动作。 原来&…

AntDesignVue动态创建下拉菜单

最近项目需要&#xff0c;有需要动态创建下拉菜单的需求&#xff0c;特此记录一下。 vue版本&#xff1a;3.1.4 ant-design-vue版本&#xff1a;2.1.6 需求是下拉菜单项可以根据配置来控制是否显示&#xff0c;那么就需要用到 v-for 和 v-if 的结合。 v-for 和 v-if 是不能…

MOSFET N-CH 30V SM3323NHQAC-TRG、SI7114DN-T1-GE3场效应管

型号&#xff1a;SM3323NHQAC-TRG SM3323NHQAC 描述&#xff1a;N沟道 30V 54A 封装&#xff1a;DFN3x3D-8 型号&#xff1a;SI7114DN-T1-GE3 SI7114DN 描述&#xff1a;MOSFET N-CH 30V 11.7A PPAK1212-8 FET 类型&#xff1a;N 通道 技术&#xff1a;MOSFET&#xff08;金属…

【C++进阶】map和set——中篇(AVL树的学习)

&#x1f387;C笔试强训 博客主页&#xff1a;一起去看日落吗分享博主的C刷题日常&#xff0c;大家一起学习博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a;夜色难免微凉&#xff0c;前方必有曙光 &#x1f31e;。 &#x1f341; &…

第8章 数据库连接池

*数据库连接池的基本思想&#xff1a;为数据库建立一个缓冲池&#xff0c;预先在缓冲池中放入一定数量的连接&#xff0c;当需要建立数据库连接时&#xff0c;只需要从缓冲池中取出一个&#xff0c;使用完毕后再放回 *数据库连接池负责分配、管理和释放数据库连接&#xff0c;…

Java 变量和数据类型

Java 变量和数据类型Java 变量Java变量概念变量使用的基本步骤案例&#xff1a;输出人的信息&#xff08;年龄&#xff0c;成绩&#xff0c;性别&#xff0c;姓名&#xff09;变量使用注意事项案例&#xff1a;变量使用注意事项程序中 号的使用案例数据类型整数类型基本介绍案…

Spring Bean的生命周期源码解析

文章目录前言零、Bean生命周期流程图一、加载类二、实例化前2.1、使用案例2.2、源码---InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation()三、实例化3.1、Supplier创建对象3.2、工厂方法创建对象3.3、推断构造方法3.4、源码四、BeanDefinition的后置处理4…

在Ubuntu下安装地球物理学专业软件madagascar

1.下载安装文件 git clone https://github.com/ahay/src RSFSRC这一步搞好后会在当前路径下生成RSFSRC 文件夹 2.预安装 安装依赖软件 sudo apt-get install libxaw7-dev freeglut3-dev libnetpbm10-dev libgd-dev \ libplplot-dev libavcodec-dev libcairo2-dev libjpeg-d…

(设计模式)工厂模式

工厂模式 工厂模式&#xff08;Factory Pattern&#xff09;是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 在工厂模式中&#xff0c;我们在创建对象时不会对客户端暴露创建逻辑&#xff0c;并且是通过使用…

【C++】C++基础知识(五)---数组

C基础知识&#xff08;五&#xff09;1. 一维数组1.1 定义方式1.2 数组名用途1.3 案例分析2. 二维数组2.1 定义方式2.2 数组名用途2.3 案例分析3. 多维数组1. 一维数组 数组就是一个集合&#xff0c;里面存放了相同类型的数据元素。 特点&#xff1a; 1、数组中每个元素的数据…

探究并发和并行、同步和异步、进程和线程、阻塞和非阻塞、响应和吞吐等

一. 并发和并行 操作系统扫盲&#xff1a; 1. 对于单核cpu而言(不管单核单线程也好&#xff0c;单核多线程也罢)&#xff0c;同一时间只能干一件事&#xff01;&#xff01;为了看起像可以“同时干多件事”&#xff0c;windows操作系统把cpu的时间划分为长短基本相同的时间区间…

Golang入门笔记(3)—— 运算符

本来这块代码&#xff0c;作为有了一点语言基础的人是真不想写的&#xff0c;因为和其他语言没有什么不同的地方&#xff0c;但是就怕 真的还有人看我的帖子&#xff0c;还真怕真的有初学者在看我帖子&#xff0c;所以还是贴心的抄了一遍。 和Java不同的地方 1. &变量取地址…