C++ STL 容器 vector 常见用法总结
vector 是 C++ STL 中最常用的顺序容器之一,本质上可以理解为动态数组。
它支持:
-
按下标随机访问
-
尾部高效插入删除
-
自动扩容
在蓝桥杯、算法竞赛、OJ 题目中,vector 使用非常频繁。
1. 头文件与定义
基本定义方式
vector<int> a; // 空 vector
vector<int> b(5); // 5 个元素,默认值为 0
vector<int> c(5, 2); // 5 个元素,每个都是 2
vector<int> d = {1, 2, 3, 4}; // 初始化列表
vector<int> e(a); // 用 a 拷贝构造
2. 元素访问
通过下标访问
使用 at()
at() 和 [] 的区别:
[]不检查越界at()会检查越界,更安全,但稍慢
访问首尾元素
3. 常用操作
3.1 push_back():尾部插入元素
结果:
这是 vector 最常用的操作之一。
3.2 pop_back():删除尾部元素
删除最后一个元素。
注意:
- 不能对空
vector调用pop_back()
Danger
pop_back() = 删除最后一个元素(无返回值) back() = 获取最后一个元素(不删除)
3.3 size():返回元素个数
注意返回值类型是 size_t,比赛里通常直接用即可。
3.4 empty():判断是否为空
3.5 clear():清空所有元素
清空后:
v.size() == 0
3.6 resize():改变大小
vector<int> v = {1, 2, 3};
v.resize(5); // 扩大为 5 个元素,多出来的默认补 0
// v = {1, 2, 3, 0, 0}
v.resize(7, 9); // 扩大为 7 个元素,多出来补 9
// v = {1, 2, 3, 0, 0, 9, 9}
v.resize(2); // 缩小为 2 个元素
// v = {1, 2}
3.7 assign():重新赋值
结果:
4. 遍历 vector
4.1 下标遍历
4.2 范围 for 遍历
如果要修改元素:
4.3 迭代器遍历
C++11 可简写为:
5. 插入与删除
5.1 insert():指定位置插入
结果:
也可以插入多个相同元素:
5.2 erase():删除指定位置元素
结果:
删除区间:
表示删除 [1, 3) 区间元素。
6. 排序与翻转
这些通常配合 <algorithm> 使用。
6.1 升序排序
结果:
6.2 降序排序
6.3 反转
7. 查找
7.1 find()
7.2 count()
统计某个值出现次数。
8. 二维 vector
在题目中经常用于存图、矩阵、二维数组。
定义二维 vector
表示:
-
3 行
-
4 列
-
初始值全为 0
访问二维 vector
遍历二维 vector
for (int i = 0; i < a.size(); i++) {
for (int j = 0; j < a[i].size(); j++) {
cout << a[i][j] << " ";
}
cout << endl;
}
9. 常见应用场景
9.1 代替普通数组
适合大小运行时才知道的情况。
9.2 邻接表存图
int n, m;
vector<vector<int>> g(n + 1);
for (int i = 0; i < m; i++) {
int u, v;
cin >> u >> v;
g[u].push_back(v);
}
9.3 存储结果序列
最后统一输出:
10. 容量相关函数
10.1 capacity()
表示当前已分配空间能容纳多少元素。
10.2 reserve()
提前申请空间,减少扩容次数。
在数据量较大、频繁 push_back 时有一定优化作用。
11. 常见注意事项
11.1 下标不要越界
错误示例:
合法下标范围:
11.2 erase() 后迭代器可能失效
删除元素后,后面的元素位置会前移,所以原有迭代器、下标逻辑要小心。
11.3 vector 尾插效率高,但头插较慢
-
push_back():快 -
insert(v.begin(), x):慢
因为头部插入会导致大量元素后移。
11.4 清空不一定释放容量
只是清空元素,未必释放内存。
如果想尽量释放空间,可以写:
12. 蓝桥杯常见模板
输入一个长度为 n 的数组
输出 vector
排序去重
说明:
-
unique()只是把重复元素移到后面 -
真正删除要配合
erase()
倒序输出
更稳妥的写法:
因为 v.size() 是无符号类型。
13. 一份常用示例代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<int> v = {3, 1, 4, 1, 5};
v.push_back(9); // 尾插
v.pop_back(); // 删除尾部
sort(v.begin(), v.end()); // 排序
for (int x : v) {
cout << x << " ";
}
cout << endl;
v.erase(unique(v.begin(), v.end()), v.end()); // 去重
for (int x : v) {
cout << x << " ";
}
cout << endl;
return 0;
}
14. 总结
vector 的核心特点可以概括为:
-
动态数组
-
支持随机访问
-
尾部插入删除高效
-
非常适合比赛中存储序列、数组、邻接表、结果集
最常用的操作一般就是这些:
-
定义:
vector<int> v; -
尾插:
push_back() -
遍历:下标 / 范围
for -
排序:
sort() -
删除:
erase() -
去重:
sort + unique + erase -
二维数组:
vector<vector<int> > arr