一、模板类vector
vector使用new和delete来自动管理内存。
1、首先,使用vector要包含头文件vector;
2、其次,vector包含在名称空间std中,因此可使用using编译指令、using声明或std::vector;
3、第三,模板使用不同语法来指出它所存储的数据类型;
4、第四,vector类使用不同的语法来指定元素数。
5、使用方法:
vector<double> vt(n_elem);其中n_elem可以是整型常量,也可以是整型变量。
由于vector对象在插入或添加值时自动调整长度,因此可以将初始长度设为零。
二、模板类array(C++11)
vector类的功能比数组强大,但效率稍低。如果需要长度固定的数组,使用数组更佳,但代价是不方便和不安全。C++11新增模板类array,位于名称空间std中,与数组一样,array对象的长度也是固定的,也是用栈(静态内存分配),而不是自由存储区,因此效率与数组相同,但更方便与安全。
array<typename,n_elem> arr;
与vector不同,n_elem不能是变量。
在C++11中,可将列表初始化用于vector和array,但在C++98中不能。
三、例子
#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;
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;
cin.get();
return 0;
}
索引-2即*(a1-2) = 20.2;
其含义如下:
找到a1指向的地方,向前移两个double元素,并将20.2存储到目的地。即是将信息存储到数组外面。与C语言一样,C++也不检查这种超界错误,在这个示例中,这个位置位于array对象a3中。其他编译器可能将20.2放在a4中,这表明数组的行为是不安全的。
使用成员函数at()或中括号表示法避免不安全的行为
a2.at(1) = 2.3;
两者的区别在于,使用at()时,将在运行期间捕获非法索引,而程序默认将中断。这种额外检查代价是运行时间更长。
下面这些类能够降低意外超界错误的概率,如begin()和end()。