C++数组、vector对象和array对象的比较

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

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5p6t6L-c,size_20,color_FFFFFF,t_70,g_se,x_16

 下面是该程序的输出示例:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5p6t6L-c,size_16,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5p6t6L-c,size_13,color_FFFFFF,t_70,g_se,x_16

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

a4126d6f34a24d219c40fa903b606685.png
       索引-2是什么意思呢?这将被转换为如下代码:

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

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5p6t6L-c,size_19,color_FFFFFF,t_70,g_se,x_16
       然而,您还有其他选择。一种选择是使用成员函数at()。就像可以使用cin对象的成员函数getline()一样,您也可以使用vector和array对象的成员函数at():watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5p6t6L-c,size_20,color_FFFFFF,t_70,g_se,x_16
       中括号表示法和成员函数at()的差别在于,使用at()时,将在运行期间捕获非法索引,而程序默认将中断。这种额外检查的代价是运行时间更长,这就是C++允许您使用任何一种表示法的原因所在。另外,这些类还让您能够降低意外超界错误的概率。例如,它们包含成员函数begin()和end(),让您能够确定边界,以免无意间超界。

 

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小枭码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值