#--------------------------------vector&array-------------------------------#
/* 模板类vector */
//vector<typeName> vt(n_elem); //创建名为vt的vector对象,它可存储n_elem个类型为typeName的元素,其中(n_elem)可以省略,n-elem可以是变量
//要使用vector对象,必须包含vector头文件,另外vector包含在名称空间std中,因此可以使用using编译指令、using声明或std::vector
//vector使用new和delete来管理内存,这种工作是自动完成的
//vector对象存储在自由存储区(堆)中
/* 模板类array */
//array<typeName,n_elem> arr; //创建名为arr的array对象,包含n_elem个类型为typeName的元素,其中n_elem不可省略,且n_elem不可是变量
//要使用array对象,必须包含头文件array,它也位于名称空间std中
//array的长度是固定的,和数组一样存储在栈中(静态内存分配)中
#include <iostream>
#include <vector>
#include <array>
int main()
{
using namespace std;
double a1[4]={1.2,2.4,3.6,4.8}; //声明普通数组a1
vector<double> a2(4); //创建名为a2的vector对象,其数据类型为double包含4个元素
a2[0]=1.0/3.0; //给a2的第一个元素赋值
a2[1]=1.0/5.0; //给a2的第二个元素赋值
a2[2]=1.0/7.0; //给a2的第三个元素赋值
a2[3]=1.0/9.0; //给a2的第四个元素赋值
array<double,4> a3={3.14,2.72,1.62,1.41}; //创建名为a3的array对象,其数据类型为double包含4个元素
array<double,4> a4; //创建名为a3的array对象,没有初始化
a4 = a3; //如果存储的数据的个数是一样的,那么可以将一个array对象赋给另一个array对象,但是对于数组,必须逐元素复制数据
cout<<"a1[2]: "<<a1[2]<<" at "<<&a1[2]<<endl; //&a1[2]表示取数组a1中第三个元素的地址
cout<<"a2[2]: "<<a2[2]<<" at "<<&a2[2]<<endl; //a2是一个vector对象,可以使用数组表示法来访问各个元素
cout<<"a3[2]: "<<a3[2]<<" at "<<&a3[2]<<endl; //a3是一个array对象,可以使用数组表示法来访问各个元素
cout<<"a4[2]: "<<a4[2]<<" at "<<&a4[2]<<endl; //a4是一个array对象,可以使用数组表示法来访问各个元素
a1[-2]=20.2; //编译器将把这句转换为*(a1-2)=20.2,即找到a1指向的地方,向前移两个double元素,并将20.2存储到目的地,也就是说将20.2存储在数组的外面
//在这个实例中这个位置位于array对象a3中
//c++并不检查此类错误
cout<<"a1[-2]: "<<a1[-2]<<" at "<<&a1[-2]<<endl; //打印a[-2]:20.2 at 0x28ccc8
cout<<"a3[2]: "<<a3[2]<<" at "<<&a3[2]<<endl; //打印a3[2]:20.2 at 0x28ccc8 巧了,(a1-2)这个地址位于array对象a3中
cout<<"a4[2]: "<<a4[2]<<" at "<<&a4[2]<<endl; //打印a4[2]:1.62 at 0x28cca8
//使用at()成员函数,使用at()时候,将在运行期间捕获非法索引,降低意外超界错误概率,但是会使程序运行时间变长
a2.at(1)=2.3; //给a2的第二个元素赋值为2.3,其中a2是vector对象
a3.at(2)=2.8; //给a3的第三个元素赋值为2.8,其中a3是array对象
return 0;
}
最后编辑于 2019.02.20 15:23 家