#include <iostream>
#include <vector>
#include <array>
int main()
{
using namespace std;
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;
//vector对象存储在自由存储区或者堆中
array<double, 4> a3 = {3.14, 2.72, 1.62, 1.41};
//声明array对象的基本格式:array<typeName,n_elem> arr;
//与数组一样,array的长度是固定的,使用栈,n_elem不能时变量;
array<double, 4> a4;
a4 = a3;//可以将一个array对象赋值给另一个array对象,但是对于数组,必须逐元素复制数据。
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;
//索引是-2的意思是:可以将a1[-2]转化成*(a1-2),找到a1指向的位置,向前移两个double元素,
//并将20.2存储在目的地,也就是把数组存储在数组外面。c++不检查这种越界错误,所以数组不安全。
//使用vector和array可以选择让它们禁止这种错误,使用成员函数at()
a2.at(1) = 2.3;//当使用成员函数at(),将在运行期间捕获非法索引,而程序默认将中断,所以这种额外检查的代价是运行时间长.
cout << "a3[2]: " << a3[2] << " at " << &a3[2] << endl;
cout << "a4[2]: " << a4[2] << " at " << &a4[2] <<endl;
for(int i = 0;i<4;++i)
{
cout << a3[i] << endl;
}
for(int i = 0;i<4;++i)
{
cout << a4[i] << endl;
}
return 0;
}
a1[2]: 3.6 at 0x61fd20
a2[2]: 0.142857 at 0x7a1c40
a3[2]: 1.62 at 0x61fce0
a4[2]: 1.62 at 0x61fcc0
a1[-2]: 20.2 at 0x61fd00
a3[2]: 1.62 at 0x61fce0
a4[2]: 1.62 at 0x61fcc0
3.14
2.72
1.62
1.41
3.14
2.72
1.62
1.41