首页 > 编程笔记 > C++笔记 阅读:3

C++ std::vector向量容器的用法(新手必看)

STL(标准模板库)是 C++ 中一个至关重要的类库,它提供了丰富的常用数据结构和算法。

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 不会自动检查这些条件,因此我们需格外小心,以免运行时出错。

相关文章