C++学习——数组的替代品vector

2023-05-16

模板类vector

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

这里不深入探讨模板类意味着什么,而只介绍一些基本的实用知识。首先,要使用vector对象,必须包含头文件vector。其次,vector包含在名称空间std中,因此您可使用using编译指令、using声明或std::vector。第三,模板使用不同的语法来指出它存储的数据类型。第四,vector类使用不同的语法来指定元素数。下面是一些示例:


#include<vector>
...
using namespace std;
vector<int> vi;
int n;
cin>>n;
vector<double> vd(n);  

其中,vi是一个vector<int>对象,vd是一个vector<double>对象。由于vector对象在您插入或添加值时自动调整长度,因此可以将vi的初始长度设置为零。但要调整长度,需要使用vector包中的各种方法。

一般而言,下面的声明创建一个名为vt的vector对象,它可存储n_elem个类型为typeName的元素:

 vector<typeName> vt(n_elem); 

其中参数n_elem可以是整型常量,也可以是整型变量。

模板类array(C++11)

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


#include <array>
...
using namespace std;
array<int ,5> ai;
array<double,4> ad={1.2,2.1,3.43,4.3};  

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

 array<typeName,n_elem> arr; 

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

在C++11中,可将列表初始化用于vector和array对象,但在C++98中,不能对vector对象这样做。

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

要了解数组、vector对象和array对象的相似和不同之处,最简单的方式可能是看一个使用它们的简单示例


int main() {
    double a1[4] = { 1.2,2.4,3.6,4.8 };
    vector<double> a2(4);  //创建含4个元素的vector
    a2[0] = 1.0 / 3.0;
    a2[1] = 1.0 / 5.0;
    a2[2] = 1.0 / 7.0;
    a2[3] = 1.0 / 9.0;
    //c++11--创建并初始化数组对象
    array<double, 4> a3 = { 3.14,2.72,1.62,1.41 };
    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] = 20.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;
}  

程序说明

首先,注意到无论是数组、vector对象还是array对象,都可使用标准数组表示法来访问各个元素。其次,从地址可知,array对象和数组存储在相同的内存区域(即栈)中,而vector对象存储在另一个区域(自由存储区或堆)中。第三,注意到可以将一个array对象赋给另一个array对象;而对于数组,必须逐元素复制数据。

接下来,下面一行代码需要特别注意:

 a1[-2] = 20.2; 

索引-2是什么意思呢?本章前面说过,这将被转换为如下代码:

 *(a1-2) = 20.2; 

其含义如下:找到a1指向的地方,向前移两个double元素,并将20.2存储到目的地。也就是说,将信息存储到数组的外面。与C语言一样,C++也不检查这种超界错误。在这个示例中,这个位置位于array对象a3中。其他编译器可能将20.2放在a4中,甚至做出更糟糕的选择。这表明数组的行为是不安全的。

vector和array对象能够禁止这种行为吗?如果您让它们禁止,它们就能禁止。也就是说,您仍可编写不安全的代码,如下所示:

 a2[-2]=.5; a3[200] = 1.4 

然而,您还有其他选择。一种选择是使用成员函数at()。就像可以使用cin对象的成员函数getline()一样,您也可以使用vector和array对象的成员函数at():

 a2.at(1)=2.3; 

中括号表示法和成员函数at()的差别在于,使用at()时,将在运行期间捕获非法索引,而程序默认将中断。这种额外检查的代价是运行时间更长,这就是C++让允许您使用任何一种表示法的原因所在。另外,这些类还让您能够降低意外超界错误的概率。

 

转载于:https://www.cnblogs.com/Qiansion/p/11506618.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++学习——数组的替代品vector 的相关文章

  • 如何使用类初始化 STL 向量/列表而不调用复制构造函数

    我有一个 C 程序 它使用包含类实例的 std list 如果我打电话 例如myList push back MyClass variable 它经历创建临时变量的过程 然后立即将其复制到向量 然后删除临时变量 这远没有我想要的那么高效 而
  • 使用迭代器从“查找”或“删除”中删除

    我想知道在 C 中从向量中删除元素的最佳实践是什么 我多次看到人们使用 std remove 查找并删除元素 然后使用擦除从向量中删除元素 但为什么它比使用 find 获取要删除的元素的迭代器然后使用该迭代器的擦除更好呢 Thanks st
  • Octave/Matlab:向向量添加新元素

    有一个向量x我必须添加一个元素 newElem 有什么区别吗 x end 1 newElem and x x newElem x end 1 newElem更稳健一些 x x newElem 仅当x是行向量 如果它是列向量x x newEl
  • gnuplot 动画 2D 矢量场

    我正在尝试使用 gnuplot 制作 2D 矢量动画 我想显示一行 即一次显示一个向量 我的数据结构如下 它们x y u v 2 24448 0 270645 1 00 1 00 3 24448 0 270645 0 500 1 20 我可
  • 是否可以将向量的一部分作为向量发送给函数? [复制]

    这个问题在这里已经有答案了 我想看看是否可以将向量的一部分传递给函数 以便它显示为函数的法线向量 更重要的是 我希望这可以在 O 1 的常数时间内完成 我不想迭代向量来创建一个新向量 事实上 我还希望在下面的示例中将新向量的大小更改为 40
  • 如何在 C++ 中将值从向量转换为映射?

    我想做这样的事情 有没有一个stl算法可以轻松做到这一点 for each auto aValue in aVector aMap aValue 1 如果您有一个对向量 其中对中的第一项将是映射的键 第二项将是与该键关联的值 您可以使用插入
  • Three.js 设置并读取相机外观向量

    而不是使用camera rotation或lookAt 函数旋转相机 我想将外观矢量直接传递给相机 是否可以直接设置相机外观矢量以及是否可以从相机读取外观矢量 相机没有 外观矢量 因此无法设置它 但是 您可以构造一个point通过将您的外观
  • 将 R 中的向量按特定顺序转换为下三角矩阵

    我有一个向量 其中元素的顺序很重要 比如说 x lt c 1 2 3 4 我想将我的向量排列成具有特定顺序的下三角矩阵 其中每行包含向量的前一个元素 我的目标是获得以下矩阵 lower diag matrix 1 2 3 4 1 4 0 0
  • 使用步骤 c++ 构建向量

    是否可以在不使用 C 中的循环的情况下以固定步骤创建从一个值到另一个值的向量 例如 我想用步长 0 5 构建一个从 1 到 10 的向量 在 MATLAB 中我可以按如下方式执行此操作 vector 1 0 5 10 c 中有类似的东西吗
  • 如何逐步绘制矢量路径? (拉斐尔.js)

    如何逐步动画化矢量路径 就像它被绘制一样 换句话说 慢慢地逐像素地显示路径 我在用着Rapha l js but如果您的答案不是特定于库的 例如可能有一些通用的编程模式可以完成此类事情 我对矢量动画相当陌生 欢迎 使用直线路径很容易做到 就
  • 如果我不定义向量大小,程序会崩溃

    最近在学习C 偶然发现这个问题 std vector
  • 在 C++ 中将成对向量转换为两个独立向量的最快方法

    假设我有一个vector of pair
  • 如何将带有自定义分配器的 std::vector 传递给需要带有 std::allocator 的函数?

    我正在使用外部库 pcl 因此我需要一个不会更改现有函数原型的解决方案 我正在使用的一个函数生成一个std vector
  • 删除向量类成员

    我有一个 A 类 其成员是另一个 B 类的对象指针向量 class A std vector
  • 使用 swig 类型映射将向量> & 从 C++ 方法返回到 python 元组列表

    我在尝试包装一个 C 方法时遇到了很多麻烦 该方法将对向量的常量引用返回到 Python 元组列表 typemap out 我目前有这样的事情 myclass h inlcude
  • 将字符串解析为结构变量

    我试图将字符串解析为其中包含不同变量的结构向量 这是我到目前为止所拥有的 但似乎不起作用 struct client string PhoneNumber string FirstName string LastName string Ag
  • R 中的整数或双精度列表

    我有一个大约 1000 个整数的列表 我需要能够进行一些数学计算 但它们被困在列表或字符形式中 我怎样才能切换它们以便它们可用 样本数据 gt y 1 1 7 3 1 6 7 1 7 6 5 3 1 3 3 0 6 2 4 9 19 1 9
  • 如果元素 id 与搜索参数匹配,如何从 std::vector 中删除元素

    我正在尝试编写一种算法 如果项目 ID 与参数匹配 该算法将搜索项目向量并从项目向量中删除项目 请参阅下面的示例代码 struct item item int newID id newID bool operator const item
  • 稀疏向量模板类:如何清理它?

    我不确定这是否是一个好问题 如果不是 请关闭它 我开始写 使用boost coordinate vector作为起点 sparse vector有效实现类似向量接口的模板类 但很稀疏 它实现了所有常见的向量运算和一个迭代集合元素的快速稀疏迭
  • 用矩阵变换 3D 向量的方法

    我一直在阅读一些关于用矩阵转换 Vector3 的文章 并且正在努力深入研究数学并自己编码 而不是使用现有代码 无论出于何种原因 我的学校课程从未包含矩阵 所以我正在填补我的知识空白 值得庆幸的是 我认为我只需要一些简单的东西 背景是我正在

随机推荐

  • make问题:make[1] entering directory

    make问题 xff1a make 1 entering directory 执行make distclean命令 posted on 2014 07 16 07 48 一生学习 何来毕业 阅读 评论 编辑 收藏 转载于 https www
  • 关于TIA博图V13的超详细WIN10安装教程(STEP 7 V13、wincc V13、PLCSIM)

    博途V13全部 含激活 xff08 STEP 7 V13 wincc V13 PLCSIM xff09 xff1a 百度云盘下载 提取码 xff1a m6ve 注意 注意安装顺序先安装STEP 7 V13 在安装wincc V13 最后在安
  • Dockerfile文件详解

    什么是dockerfile Dockerfile是一个包含用于组合映像的命令的文本文档 可以使用在命令行中调用任何命令 Docker通过读取Dockerfile中的指令自动生成映像 docker build命令用于从Dockerfile构建
  • SCUT - 31 - 清一色 - dfs

    https scut online p 31 还是不知道为什么RE了 的确非常玄学 重构之后就没问题了 果然写的越复杂 xff0c 分的情况越乱就越容易找不到bug code include lt bits stdc 43 43 h gt
  • matlab结构体嵌套结构体,科学网-[MATLAB]方便快捷读取结构体里数个结构体内的数据-胡振东的博文...

    clc clear close all cd F 01 DATA Data process Glide load 39 Glide0 mat 39 Glide0 mat里的Glide结构体有G1 xff0c G2 G11结构体 xff0c
  • 计算所考研复试

    计算所考研复试 本人参加19年计算所考研360 43 xff0c 专业课为863 xff0c 计算所复试分数线为322 quad quad 简单说一下结果吧 xff0c 本科哪里的就不说了 xff0c 成功上岸 xff0c 但不太理想 xf
  • js中的事件委托或是事件代理详解

    起因 xff1a 1 这是前端面试的经典题型 xff0c 要去找工作的小伙伴看看还是有帮助的 xff1b 2 其实我一直都没弄明白 xff0c 写这个一是为了备忘 xff0c 二是给其他的知其然不知其所以然的小伙伴们以参考 xff1b 概述
  • 信息安全政策(等级保护、分级保护)

    等级保护 信息安全等级保护管理办法 将信息系统的安全保护等级分为以下五级 xff1a 第一级 xff0c 信息系统受到破坏后 xff0c 会对公民 法人和其他组织的合法权益造成损害 xff0c 但不损害国家安全 社会秩序和公共利益 第一级信
  • ROS知识(16)----如何编译时自动链接同一个工作空间的其他包的头文件(包含message,srv,action自动生成的头文件)...

    catkin make编译时 xff0c 往往需要自动链接同一个工作空间的其他包的头文件 否则会出现类似如下的错误 xff1a home xx xx ws srcA package src db hpp 13 26 fatal error
  • kubernetes入门实践

    k8s中文文档 k8s概念比较多 xff0c 有什么概念的疑惑的推荐看k8s中文文档 me的环境 操作系统 xff1a centos7docker xff1a 1 12 6 环境跟me的不一致 xff1f 不要慌 xff0c 基本大部分操作
  • vscode修改主题颜色(背景颜色)的快捷方式

    当周围强光比较耀眼时 xff0c 如何快速切换vscode的 主题颜色 xff0c 第一步 xff1a 同时按下Ctrl 43 K xff1b 第二步 xff1a 同时按下Ctrl 43 T xff1b 然后弹出多个系统自带的主题 xff0
  • 【C/C++】实型变量

    实型变量的分类 单精度 float 双精度 double 长双精度 long double 实型数据的舍入误差 由于实型变量是由有限的存储单元 组成的 xff0c 因此能提供的有效数字总是有限的 1 include lt stdio h g
  • 使用linux4.15内核lts,Ubuntu 18.04 LTS发布: 采用Linux 4.15内核

    原标题 xff1a Ubuntu 18 04 LTS发布 xff1a 采用Linux 4 15内核 导读4月27日消息 Canonical于伦敦时间26日正式发布了Ubuntu 18 04 LTS版 xff0c Canonical的CEO称
  • c语言malloc struct,使用malloc()函数创建结构体

    malloc 可用来为结构体分配存储空间 结构体的大小通过使用sizeof运算符来确定 示例代码 include include include int main struct Product char symbol 5 int quant
  • VirtualBox的快照功能

    VirtualBox是非常好用的一个虚拟机软件 xff0c 无论是性能还是易用性不比商用的Vmware差 VirtualBox最初是Sun公司的产品 xff0c 由于Sun被Oracle收购 xff0c 现在也归Oracle了 除了虚拟机的
  • 算法:关于生成抽样随机数的这些算法

    概述 xff1a 这里你是不是会说 xff0c 生成随机数有什么难的 xff1f 不就是直接使用Java封装好了的random就行了么 xff1f 当然对于一般情况下是OK的 xff0c 而且本文要说明的这些算法也是基于这个random库函
  • 如何在Ubuntu上搭建WordPress网站,并公网可访问 12-17

    系列文章 如何在Ubuntu上搭建WordPress网站 xff0c 并公网可访问 1 17如何在Ubuntu上搭建WordPress网站 xff0c 并公网可访问 2 17如何在Ubuntu上搭建WordPress网站 xff0c 并公网
  • 琼瑶评价

    作者 xff1a 李小喵 链接 xff1a https www zhihu com question 327292932 answer 712018512 来源 xff1a 知乎 著作权归作者所有 商业转载请联系作者获得授权 xff0c 非
  • 【】论晚睡晚起的危害

    早睡早起 xff0c 按时睡觉按时起床 xff0c 在生活安排 xff0c 计划执行中扮演着至关重要的角色 晚睡晚起有五大害处 xff1a 1 xff09 晚睡晚起往往睡眠质量不佳 xff0c 睡眠时间比计划延长 由此导致白天时间不够 xf
  • C++学习——数组的替代品vector

    模板类vector 模板类vector类似于string类 xff0c 也是一种动态数组 您可以在运行阶段设置vector对象的长度 xff0c 可在末尾附加新数据 xff0c 还可在中间插入新数据 基本上 xff0c 它是使用new创建动