「C/C++」之数组、vector对象和array对象的比较
liuian 2024-12-23 12:10 40 浏览
数组
学习过C语言的,对数组应该都不会陌生,于是这里就不再对数组进行展开介绍。
模板类vector
模板类vector类似于string,也是一种动态数组。能够在运行阶段设置vector对象的长度,可以在末尾附加新数据,还可以在中间插入新数据。基本上,它是使用new创建动态数组的替代品。实际上,vector类确实是使用new和delete来管理内存,但是这种工作是自动完成的,你不需要去了解内部的工作原理,我们来看一下它的语法是怎么样的:
#include <vector>
using namespace std;
vector<int> v1; //声明一个int型数组
int n;
cin >> n;
vector<double> v2(n); //声明一个double型的n维数组
使用vector类的使用需要包含头文件<vector>,同时它包含在名称空间std中,所以需要使用using指令。
更为通常的语法形式为:
vector<typename> vname(n_element);
- typename :类型名
- vname:变量名
- n_element:维数,可以是整型常量,也可以是整型变量
模板类array
vector类的功能强大,但是效率比较低。如果需要长度固定的数组,name数组是比较好的选择,但是数组又不是那么安全。于是乎C++11新增了模板类array,同样的它也需要一个头文件<array>,位于std名称空间。
与数组一样,array对象长度是固定的,但是更方便,更安全。具体使用如下;
#include <array>
?
using namespace std;
array<int, 4> a1;
array<double, 4> a2 = {1.1, 1.2, 1.3, 1.4};
同样的更通用的表示格式为:
array<typename, n_element> aname;
注意:与vector不同n_element不能是变量。
比较
想要了解数组、vector对象和array对象的相似与不同之处,最简单的方式可能就是看一个使用它们的简单小程序:
完整程序代码如下:
#include <iostream>
#include <vector>
#include <array>
?
using namespace std;
?
int main()
{
double a1[4] = { 1.2,2.3,3.4,4.5 };
vector<double> a2(4);
a2[0] = 1.0 / 2.0;
a2[1] = 1.0 / 3.0;
a2[2] = 1.0 / 4.0;
a2[3] = 1.0 / 5.0;
array<double, 4> a3 = { 2.1,3.2,4.3,5.4 };
array<double, 4> a4;
a4 = a3;
cout << "a1[2]: " << a1[2] << " at " << &a1[2] << endl;
cout << "a2[2]: " << a2[2] << " at " << &a2[2] << endl;
cout << "a3[2]: " << a3[2] << " at " << &a3[2] << endl;
cout << "a4[2]: " << a4[2] << " at " << &a4[2] << endl;
?
?
a1[-2] = 22.2;
cout << "a1[-2]: " << a1[-2] << " at " << &a1[-2] << endl;
cout << "a3[2]: " << a3[2] << " at " << &a3[2] << endl;
cout << "a4[2]: " << a4[2] << " at " << &a4[2] << endl;
?
return 0;
程序运行结果:
a1[2]: 3.4 at 007CFE30
a2[2]: 0.25 at 00CBECD8
a3[2]: 4.3 at 007CFDF0
a4[2]: 4.3 at 007CFDC8
a1[-2]: 22.2 at 007CFE10
a3[2]: 4.3 at 007CFDF0
a4[2]: 4.3 at 007CFDC8
程序说明
首先,注意到无论是数组、vector对象还是array对象,都是可以使用标准数组表示法来访问各个元素的,也就是通过中括号加索引值的方法。其次,从地址可知,array对象和数组存储在相同的内存区域(即栈区中),而vector对象存储在另一个区域(自由存储区或堆)中。第三,注意到可以将一个array对象赋给另一个array对象;而对于数组,必须逐元素复制数据。
接下来,这一行代码是需要注意的:
a1[-2] = 22.2;
索引-2是什么意思呢?学习了指针我们会知道,上面一行代码也可以有如下表达方式:
*(a1-2) = 22.2;
其含义如下:找到a1指向地址,向前移动两个double元素,并将22.2存储到目的地。也就是说,将信息存储到数组的外面。与C语言一样,C++也不检查这种超界错误。在这个示例中,这个位置目前没有存储其他数据,但是在别的情况下,很有可能会存放有一些重要数据,这是一种很危险的行为。
那么,vector对象和array对象能够禁止这种行为吗?我会说如果你想的话,是可以的,这意味,如果你把代码写成下面这是编译仍是可以运行的。
a2[-2] = 11.1;
a3[100] = 66.6;
当然如果你的编译器足够智能的话,上面的几种不规范的写法编译器都是会发出警告的。
此外,还有一种使用成员函数at()的写法:
a2.at(1) = 2.2;
中括号表示法和成员函数at()的差别在于,使用at()时,将在运行期间捕获非法索引,而程序默认将中断。这种额外检查的代价就是运行的时间会更长。
最近在学习c++的基本语法时,学到数组这一块,发现与C语言相比多了许多东西,于是决定简要记录一下,如有不对之处,欢迎批评指出~
相关推荐
- u盘里面装系统 可以直接用吗
-
可以。因为下载到U盘里的系统是可启动的,可以直接插入需要安装系统的电脑中启动安装程序,进行系统的安装。但是需要注意的是,不同类型的系统(如Windows和MacOS)需要不同的方法进行安装,而且在安...
- 一个win10密钥能激活几台电脑
-
零售版的密钥只能激活一台电脑,VOL版的能够批量激活。切实而今根基上用东西的人比较多,那样比较便当,提议也能够碰运气。软件可以正确辨认用户计较机上布置的悉数office版本和windows版本,包括w...
- 电脑城买电脑(电脑城买电脑装了盗版系统)
-
不太靠谱。首先电脑城的电脑同个款式配置很凌乱,要么来个阉割版、要么来个升级版,而所谓升级往往会以次充好,为的就是让你觉得少花了钱还买到了更好的配置。其次电脑城的销售人员大部分都是那种半懂的非专业人员,...
- win11很多游戏不兼容(win11不兼容的游戏)
-
据我们了解,Windows11系统和传奇游戏之间没有直接的冲突或不兼容问题。然而,可能有一些间接的原因导致此问题。首先,传奇游戏是一款老游戏,可能需要在Windows11系统上运行一些兼容性设置或...
- 华为路由器登录(华为路由器登录入口手机版)
-
华为路由器的登录地址是192.168.3.1,电脑/手机连接到华为路由器的网络后,在浏览器中输入192.168.3.1,就能进入登录入口。然后输入登录密码,可以进入华为路由器的设置页面。华为wifi设...
- 固态硬盘的缺点(固态硬盘缺点和坏处)
-
1.价格与容量 固态硬盘的容量和价格都要比机械硬盘贵 2.物理特性 固态硬盘无噪音,抗震动,体积小,发热量低,功耗也非常低,工作温度范围很大!固态硬盘的内部并没有任何机械活动部件,没有马达和风...
- 联想自带系统怎么重装(联想电脑自带系统如何重装系统)
-
联想电脑重装系统步骤:1、制作好U盘启动盘,然后把下载的联想win7系统iso文件直接复制到U盘的GHO目录下:2、在联想电脑上插入U盘,重启后不停按F12或Fn+F12快捷键打开启动菜单,选择U盘项...
- 笔记本亮度调节快捷键(调亮笔记本电脑屏幕亮度快捷键)
-
在键盘最上一排“F”打头的键中,标有小太阳的就是调节亮度的快捷键。“小太阳-”是调低,“小太阳+”是调高。有些笔记本电脑直接按这个键就可以调节,有些需要同时按住Fn(一般Fn在键盘左下角,ctrl右...
- 手机一键还原(iphone手机一键还原)
-
如果你希望恢复华为手机上的一键锁屏功能,你可以按照以下步骤进行操作:1.进入设置:在你的华为手机上,打开设置应用程序。你可以在应用抽屉中找到该应用,通常是一个齿轮或者包含「设置」字样的图标。2.寻...
- 系统修复u盘(优盘系统修复)
-
1、我们在网络中,找到修复软件U盘烧录修复(PortFreeProductionProgram)v3.27,记得不需要太高级的版本,这个比较好用。 2、打开软件,出现的页面是,初始状态下,看到...
- sony笔记本u盘启动快捷键(索尼笔记本u盘快速启动键)
-
索尼笔记本按assist按键快捷键进入u盘启动索尼笔记本进入U盘启动的步骤:1、索尼笔记本位于键盘右上角有一个ASSIST的按键,首先按这个键就可以进入vaiocare的设置。2、通过按ASSIST...
- win7旗舰版密匙(正版win7旗舰版密钥)
-
一、Windows7旗舰版激活密钥零售版:Windows7UltimateRetail永久序列号【尝试联网激活,如果不能激活,可电话激活】[Key]:RHTBY-VWY6D-QJRJ9-JGQ...
- 一键ghost备份还原工具绿色版硬盘版
-
可以的。1.打开GHOST软件,接受许可协议,点击OK。2.从图像中选择Local→Partition→,3.选择镜像文件所在的分区,找到镜像文件(winxp.gho),然后单击enter。4.显示镜...
- 一周热门
- 最近发表
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)
- c++ 字符串查找 (35)
- mysql刷新权限 (34)
