关于数组、vector对象和array对象的区别与联系
一、区别与联系
1.无论是数组,vector对象还是array对象,都可以用标准数组表示法来访问各个元素; 2. array对象和数组存储在相同的内存区域(栈),而vector对象存储在另一个区域(堆); 3. array对象可以赋值给另一个array对象,而数组必须逐元素进行复制数据; 4. 无论是数组,vector对象还是array对象,都会出现数组越界问题,但是vector对象和array对象可以采取一定的方式进行避免(调用成员函数at())。
二、代码验证
#include <iostream>
#include <vector>
#include <array>
int main() {
double a1[4] = {1.2, 2.4, 3.6, 4.8};
vector<double> a2(4);
a2[0] = 1.0/3.0;
a2[1] = 1.0/5.0;
a2[2] = 1.0/7.0;
a2[3] = 1.0/9.0;
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 << 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;
}
三、运行结果
四、结果分析
1.标准数组表示指的是[]; 2.由输出地址可见,vector对象与数组、array对象的地址不一样; 3. -2是一种非法索引,但是并没有报错,实际上,无论是数组,vector对象还是array对象,都会出现数组越界问题。
五、关于vector对象和array对象对非法索引的管理
关于确定索引值是否合法,可以使用vector对象或array对象的at()函数进行规避:
a2.at(1);
使用at()时,一旦在运行期间出现非法索引,程序会默认中断。
注意:这种额外检查的代价是运行时间更长,但是可以降低意外超界错误的概率。
|