模板类 vector、array 是数组的替代品。

4.10.1 模板类 vector

类似 string 类,也是一种动态数组,可以在运行阶段设置长度。示例:

  1. #include <vector>
  2. std::vector<int> list;

vector 虽然比数组强大,但效率稍低。

4.10.2 模板类 array(C++11)

类似数组,长度固定,使用栈而不是自由存储区,效率和数组相同但更方便、更安全。示例:

  1. #include <array>
  2. std::array<int, 5> list = {1, 2, 3, 4, 5};

4.10.3 数组、vector、array 区别

联系和区别:

  • 都可以使用标准数组表示法访问各元素;
  • 从地址上看,数组和array存储在栈中,vector存储在堆中;
  • 对于数组,只能逐元素赋值;

示例:

  1. #include <iostream>
  2. #include <vector>
  3. #include <array>
  4. using namespace std;
  5. int main()
  6. {
  7. double a1[4] = {1.2, 2.4, 3.6, 4.8};
  8. vector<double> a2(4);
  9. a2[0] = 1.0 / 3.0;
  10. a2[1] = 1.0 / 5.0;
  11. a2[2] = 1.0 / 7.0;
  12. a2[3] = 1.0 / 9.0;
  13. array<double, 4> a3 = {3.14, 2072, 1.62, 1.41};
  14. array<double, 4> a4 = a3;
  15. a1[-2] = 20.2;
  16. }

注意 a1[-2] = 20.2 这条语句,赋值到数组外面了。C++不检查这种超界错误,这表明数组的行为是不安全的。但是对于 vector、array,可以使用 at() 函数在运行期间捕获非法索引,而程序默认将中断。代价是运行时间更长。此外,使用 begin()、end() 还可以让你能够确定边界。