1. vector 的简要介绍
在数学/物理领域,vector 的中文意思是'向量'。在 C++ 标准库中,std::vector 是一个动态数组容器,中文常直接称为 vector 容器,也可意译为动态数组。所以由此可见,vector 的底层实际上就是顺序表。
参考 C++ 官方文档,我们可以看到 vector 是 C++ 标准库中定义在 std 标准命名空间下的一个模板类。它的第一个参数 class T,用于指定 vector 容器中存储元素的类型。例如写下 std::vector<int>,此时 T 被实例化为 int 类型,意味着这个 vector 容器用来存储 int 类型的数据;在 std::vector<std::string> 中,T 被实例化为 std::string 类型,容器用来存储字符串。
它的第二个参数 class Alloc = allocator,用于指定内存分配器的类型,负责为 vector 容器分配和释放内存。默认使用 allocator,这是 C++ 标准库提供的默认内存分配器,能够满足大多数情况下对内存管理的需求。不过在一些特殊场景,比如对内存分配有严格控制(像内存池的实现),或者针对特定硬件平台优化内存使用时,可以自定义内存分配器,然后通过这个参数传递给 vector。
对于 vector 这个类里面有以下内容:

我们会发现 vector 和 string 一样,都有构造函数、迭代器、容量、元素访问操作函数、修改操作函数、内存分配操作函数和非成员函数重载。

首先大家一定要明白的一点是,当你想要定义一个 vector 对象,就必须要加上它的类型,因为我们说 vector 实际上是一个顺序表,既然是顺序表它肯定会存储内容,那么内容的类型一定要确定,否则无法调用默认构造函数。
2. vector 的构造函数

大家可以看到 vector 的四个构造函数里面都有一个参数:const allocator_type& alloc = allocator_type()。它有一个缺省值是 allocator_type(),这个缺省值是 C++ 标准库提供的默认内存分配器,负责为 vector 容器分配和释放内存,只有在极少数的情况下我们才会为这个参数传值,因为 C++ 标准库提供的默认内存分配器能满足极大范围场景的使用。在这边大家就可以把它当成没看到。
首先来看第一个构造函数,它是无参构造函数,就相当于默认构造函数。
第二个构造函数当中有一个参数,它有一个缺省值叫 value_type()。这个 value_type() 是 C++ 中'值初始化'(Value Initialization)的语法形式,它会根据 value_type 的类型,生成该类型的默认值。刚刚在 vector 的简要介绍里面提到,如果想要定义一个 vector 对象,就一定要声明这个对象的类型,而这个类型就是 value_type。比如我的代码中写到:vector<int> v1; 此时 value_type 就是 int,然后通过 value_type() 去生成 int 的默认初始值,根据 C++ 的初始化规则,int 的默认初始值就是 0。如果类型是 char,那默认初始值就是 '\0',如果是类型是 double,那默认初始值就是 0.0。所以这个构造函数的作用就是创建构造一个有 n 个 val 的 vector 对象。
第三个构造函数里面的参数是迭代器,并且是 begin 和 end 迭代器。比如有两个 vector 对象,v1 和 v2,写出 v2(v1.begin(), v1.end()),就表示 v2 存储的值是 v1 的从头到尾的内容。其实有点像拷贝构造函数。
而第四个就是最普通的拷贝构造函数。
接下来给大家展示一下代码:























