数组的代替品——vector和array


  • 模板类vector
类似于string类是一个动态数组
头文件:#include<vector>
声明创建一个名为vt的vector对象,他可储存n_elem个类型为typeName的元素:
vector<typeName>vt(n_elem)
  • 模板类array
array对象和数组一样其长度是固定的,也是用栈(静态存储空间)
头文件:#include<array>
声明创建一个名为arr的array对象,它包含n_elem个类型为typename的元素:
array<typeName,n_elem>arr;
与创建vector对象不同的是,n_elem不是变量。
比较数组,vector对象和array对象
#include<iostream>
#include<vector>
#include<array>
using namespace std;
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;
    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;
    }
结果:
array对象和数组存储在相同的内存区域(栈)内,而vector存储在另一个区域中(自由存储区或堆);除此之外可以将一个array对象赋给另一个array对象,但对于数组需要一个一个复制数据。
a1[-2]=20.2也就是*(a1-2)=20.2:其定义为a1指向的地方向前移动两个double元素存储20.2,也就是将信息存储在数组之外。这个位子可能在a2或者a3上,所以这表明数组是不安全的。
那么如何防止这种索引错误呢?
可以使用成员函数。就像使用cin对象的成员函数getline()来读取正行字符串一样,vector和array对象的成员函数at():
a2.at(1)=2.3;    //将2.3赋值给a2[1],能在运行期间捕获非法索引。
阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页