C++复合类型之vector和array模板

今天我们就给小伙伴们简单的介绍一下数组的替代品,vector和array,模板类vector类似于string类,也是一种动态数组。您可以在运行阶段的设置vector对象的长度,可在末尾附加新数据,还可以在中间插入新数据。基本上,它是使用new创建动态数组的替代品 。

vector类的功能比数组强大,但付出的代价是效率稍低。如果您需要的是长度固定的数组,使用数组是更加的选择,但代价是不那么方便和安全。有鉴于此,C++11新增了模板类array,它也是位于名称空间std中。下面我们就来简单的介绍一下:

1、模板类vector

模板类vector类似与string类,也是一种动态数组。您可以在运行阶段设置vector对象的长度,可在末尾附加新数据,还可以在中间插入新数据。基本上,它是使用new创建动态数组的替代品。实际上vector类确实使用new和delete来管理内存,但这种工作是自动完成的。

--vector的使用方法: 首先,要使用vector对象,必须包含头文件vector。 其次,vector包含在名称空间std中,因此您可使用using编译指令、using声明或std::vector。 第三,模版使用不同的语法来指出它存储的数据类型。 第四,vector类使用不同的语法来指定元素数。 示例:

其中,vi是一个vector对象, vd是一个vector对象。由于vector对象在您插入或添加值时自动调整长度,因此可以将vi的初始长度设置为零。但要调整长度,需要使用vector包中的各种方法。 一般而言,下面的声明创建一个名为vt的vector对象,它可以存储n_elem个类型为typeName的元素: vector vt(n_elem); ,其中,参数n_elem可以是整形常量,也可以是整型变量。

2、模板类array

vector类的功能比数组强大,而且使用的是自由存储空间,但是付出的代价是效率稍低。如果您需要的是长度固定的数组,使用数组是更佳的选择,但代价是不那么方便和安全。有鉴于此,C++11新增了模板类array,它也位于名称空间std中。与数组一样,array对象的长度也是固定的,也使用栈(静态内存分配),而不是自由存储区,因此其效率与数组相同,但更方便更安全。 使用方法: 首先要创建array对象,需要包含头文件array.创建语法如下:

推而广之,下面的声明创建一个名为arr的array对象,它包含n_elem个类型为typename的元素:

需要注意的是,与创建vector对象不同的是,n_elem不能是变量。

3、比较数组、vector对象和array对象

从一个程序开始:

输出结果:

需要注意的地方: (1) 一个array对象可以赋给另一个array对象,而数组,必须逐个元素复制数据。 (2) 注意这个语句:a1[-2] = 20.2; 其含义是:找到a1指向的地方,向前移两个double元素,并将20.2存储到目的地。也就是说,将信息存储在数组的外面。与C语言一样,C++也不检查这种超界错误。 vector和array对象能够禁止这种行为吗?可以选择使用成员函数at()。

使用at()时,将在运行期间捕获非法索引,而程序默认将中断。这种额外的检查的代价是运行时间更长,这就是C++让允许您使用任何一种表示法的原因所在。

老九学堂出品

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器人课程与技术

ROS2编程基础课程--接口

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

9140
来自专栏老码农的一亩三分地

IT兄弟连 Java语法教程 数据类型3

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

12040
来自专栏机器人课程与技术

ROS2编程基础课程--Actions

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

14530
来自专栏老码农的一亩三分地

IT兄弟连 Java语法教程 流程控制语句 分支结构语句5

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

8220
来自专栏老码农的一亩三分地

IT兄弟连 Java语法教程 流程控制语句 控制循环结构1

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

8720
来自专栏老码农的一亩三分地

IT兄弟连 Java语法教程 流程控制语句 循环结构语句4

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

8120
来自专栏只为你下

BigDecimal常用方法详解

​ Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效...

21600
来自专栏网络小说作家的编程技术沉思录

如何写出一个性能优化的单例模式

单例模型是面试当中最常见的一种设计模式,它是一种对象创建模式,用于产生一个对象的具体实例,可以确保系统中一个类只产生一个实例。

10920
来自专栏马蜂窝技术

从国企到互联网,一个六年程序员的「得」与「失」

从学生时代至今,我经历了两次大的方向转型和一次大的技术转型:从偏理论推导的数学科学到重工程实践的计算机学科,从「安稳固化」的国企到「活跃求变」的互联网;从「人人...

12020
来自专栏老码农的一亩三分地

IT兄弟连 Java语法教程 流程控制语句 循环结构语句1

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

12240

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励