vector类的功能比数组强大,但效率没有数组高(vector对象分配在自由存储区或堆中)。
效率来讲内置数组是最高的,但是会不安全不方便,如下标越界、两个数组赋值要用循环一个个赋值。
以上两点,C++11中就新增了array类模板,来解决内置数组不安全不方便,相比vector提高效率(array对象分配在栈中)。
验证array类对象存储:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
//========================================= // Author : 梁笔记 // Copyright : https://zouzhongliang.com //========================================= #include <iostream> #include <vector> //C++ 98 #include <array> //C++ 11 using namespace std; int main() { double A[4] = {1,2,3,4}; vector<double> VectA {1,2,3,4}; array<double, 4> ArrA {1,2,3,4}; array<double, 4> ArrA1; cout<<"内置数组A:"<<&A[0]<<endl; cout<<"Vector对象VectA:"<<&VectA[0]<<endl; cout<<"array对象ArrA:"<<&ArrA[0]<<endl; cout<<"array对象ArrA1:"<<&ArrA1[0]<<endl; system("pause"); return 0; } |
对象存储地址输出结果:
内置数组A:0019FE90
Vector对象VectA:02265BB0
array对象ArrA:0019FE50
array对象ArrA1:0019FE28
请按任意键继续. . .
从上可以看出只有,Vector对象VectA:02265BB0是不在同一个内存区域。
array类对象赋值与数组赋值比较:
1 2 3 4 5 6 7 8 9 |
double A[4] = {1,2,3,4}; double A1[4]; array<double, 4> ArrA {1,2,3,4}; array<double, 4> ArrA1; for(int i=0;i<4;i++){ A1[i] = A[i]; //内置数组赋值 } ArrA1 = ArrA; //array对象可以直接赋值 |
从上面赋值代码可以看出,array对象赋值更方便。
array类对象元素访问与数组元素访问比较:
1 2 3 4 5 6 7 |
double A[4] = {1,2,3,4}; array<double, 4> ArrA {1,2,3,4}; double c = A[4]; //下标越界,不会报错 double d = ArrA.at(4); //用at()成员函数,运行期间会捕获非法索引 double e = ArrA[4]; //用下标访问,也不会报错,切记 |
array对象可以用at()成员函数访问元素,较下标访问更安全。