C++ std::vector向量容器的用法(新手必看)
STL(标准模板库)是 C++ 中一个至关重要的类库,它提供了丰富的常用数据结构和算法。
STL 中内置了许多高效的数据结构,常用的包括 vector、stack、queue、map、priority_queue 等。
vector 翻译为“向量”,实际上它是一个可变长的数组。相比 C 风格的数组需要在定义时固定长度,而 vector 支持动态扩容,使用起来非常方便。
vector 是一个顺序表,其内存空间是连续的,支持自动扩容和自动内存管理,它的基本结构如下图所示:

图 1 向量顺序表
例如:
vector 的下标与 C 风格的数组一样,从 0 开始计数,即 0-index。
下表总结了向量的一些基本操作及其时间复杂度,这些操作是开发过程中频繁使用的。
在执行 vector 的某些操作时,需要确保操作的合法性。例如,使用 erase() 时必须保证传入的迭代器是有效的;获取元素时必须确保下标在合法的范围内。vector 不会自动检查这些条件,因此我们需格外小心,以免运行时出错。
STL 中内置了许多高效的数据结构,常用的包括 vector、stack、queue、map、priority_queue 等。
vector 翻译为“向量”,实际上它是一个可变长的数组。相比 C 风格的数组需要在定义时固定长度,而 vector 支持动态扩容,使用起来非常方便。
vector 是一个顺序表,其内存空间是连续的,支持自动扩容和自动内存管理,它的基本结构如下图所示:

图 1 向量顺序表
vector初始化
在使用 vector 之前,需要引入相应的头文件。如果程序开头已经引入或包含了万能头文件,则无须再额外引入。例如:#include <vector> // #include <bits/stdc++.h> // 万能头文件中包含vector using namespace std; // vector在std命名空间中vector 的初始化方式很灵活,以下是一些常见用法,其中 T 代表数据类型,可以是 int、double、char 等,也可以是自定义的结构体。但需要注意,同一个向量中的元素类型必须一致。
例如:
vector<T> v; // 声明一个空的向量,内部元素类型为T vector<int> v_int; // 声明一个存储int类型的空向量 int n = 5; vector<int> v_int2(n); // 声明一个大小为n的向量,默认初值为0 // v_int2 = [0, 0, 0, 0, 0] int x = 3; vector<int> v_int3(n, x); // 声明一个大小为n、初值为x的向量 // v_int3 = [3, 3, 3, 3, 3]如果已确定所需的数组大小,建议在声明时设定向量的大小并赋予初值。这是因为向量的动态扩容需要额外的时间,了解其扩容机制有助于优化性能。
vector 的下标与 C 风格的数组一样,从 0 开始计数,即 0-index。
vector的基本操作
vector 作为 C++ 标准模板库中的重要组件,以其动态数组的特性广泛应用于各种数据存储和处理场景,例如临时存储、保存答案、构建邻接表等。下表总结了向量的一些基本操作及其时间复杂度,这些操作是开发过程中频繁使用的。
方法 | 作用 | 时间复杂度 |
---|---|---|
push_back(x) | 将元素 x 插入向量的末尾 | O(1) |
pop_back() | 删除尾部元素 | O(1) |
operator[idx] | 中括号操作符,返回下标 idx 所指的元素 | O(1) |
front() | 返回向量中的第一个元素,即下标为 0 的元素 | O(1) |
back() | 返回向量中的最后一个元素 | O(1) |
size() | 返回向量中的元素个数 | O(1) |
empty() | 判断向量是否为空 | O(1) |
resize(n) | 将向量的大小调整为 n,多删少补 | O(n) |
clear() | 将向量清空 | O(n) |
erase(it) | 删除迭代器 it 所指的元素 | O(n) |
insert(it, val) | 在迭代器 it 前面插入 val(复杂度太高,一般不用) | O(n) |
begin() | 返回指向向量中第一个元素的迭代器 | O(1) |
end() | 返回指向向量中最后一个元素的下一个位置的迭代器 | O(1) |
在执行 vector 的某些操作时,需要确保操作的合法性。例如,使用 erase() 时必须保证传入的迭代器是有效的;获取元素时必须确保下标在合法的范围内。vector 不会自动检查这些条件,因此我们需格外小心,以免运行时出错。