vector是C++ STL中的动态数组,支持自动内存管理与随机访问。它可通过多种方式定义初始化,如空构造、指定大小、数组或列表初始化;常用操作包括push_back、emplace_back添加元素,pop_back、erase删除元素,front、back访问首尾元素,size、capacity获取容量信息,并支持reserve预分配和resize调整大小。遍历方式有下标、迭代器和范围for循环(推荐const auto&)。vector可嵌套实现二维结构,每行长度可变。注意:内存连续,尾插删高效,中间操作慢;避免保存指针或迭代器,插入可能使它们失效;clear不释放内存,可用swap技巧释放。掌握vector能显著提升C++开发效率。

在C++中,vector 是最常用的标准模板库(STL)容器之一。它是一个动态数组,能够自动管理内存,支持随机访问,并且可以在运行时动态地添加或删除元素。相比普通数组,vector 更安全、更灵活,是处理变长数据的首选工具。
vector的基本定义与初始化
要使用 vector,需要包含头文件
常见定义方式如下:
-
空 vector:
std::vectorvec; // 创建一个空的整型vector -
指定大小:
std::vectorvec(5); // 包含5个元素,初始值为0 -
指定大小和初始值:
std::vectorvec(5, 10); // 5个元素,每个都是10 -
用数组初始化:
int arr[] = {1, 2, 3};
std::vectorvec(arr, arr + 3); -
用另一个 vector 初始化:
std::vectorvec1 = {1, 2, 3};
std::vectorvec2(vec1); -
列表初始化(C++11起):
std::vectorvec = {1, 2, 3, 4, 5};
vector的常用操作方法
vector 提供了丰富的成员函数来操作数据,以下是最核心的几种:
立即学习“C++免费学习笔记(深入)”;
1. 添加元素
- vec.push_back(x); // 在末尾插入一个元素x
- vec.emplace_back(x); // 更高效地构造并插入元素(推荐用于复杂对象)
2. 删除元素
- vec.pop_back(); // 删除最后一个元素
- vec.clear(); // 清空所有元素
- vec.erase(iter); // 删除迭代器指向的元素
- vec.erase(begin + 1, begin + 3); // 删除区间 [1,3)
3. 访问元素
- vec[i]; // 随机访问第i个元素(不检查越界)
- vec.at(i); // 访问第i个元素,会做越界检查,越界抛出异常
- vec.front(); // 返回第一个元素
- vec.back(); // 返回最后一个元素
- &vec[0]; // 获取首元素地址,可用于传给C风格函数
4. 容量与大小相关
- vec.size(); // 当前元素个数
- vec.empty(); // 判断是否为空,返回 true/false
- vec.capacity(); // 当前分配的存储空间能容纳多少元素
- vec.reserve(n); // 预分配至少n个元素的空间,避免频繁扩容
- vec.resize(n); // 改变大小,若n大于原大小,则用0填充
- vec.resize(n, val); // 扩展时用val填充
vector的遍历方式
有多种方式可以遍历 vector 中的元素:
1. 下标遍历
for (int i = 0; i std::cout }2. 迭代器遍历
for (auto it = vec.begin(); it != vec.end(); ++it) {std::cout }
3. 范围 for 循环(C++11 推荐)
for (const auto& x : vec) {std::cout }
使用 const auto& 可以避免拷贝,提高效率。
vector的二维使用(模拟二维数组)
vector 也可以嵌套使用,创建二维结构:
std::vector<:vector>> matrix(3, std::vector// 创建3行4列的二维vector,初始值为0
访问方式与普通二维数组一致:
matrix[1][2] = 5;也可逐行添加:
std::vector<:vector>> grid;grid.push_back({1, 2, 3});
grid.push_back({4, 5});
注意:每一行可以有不同的长度,不像数组那样必须规整。
注意事项与性能建议
- vector 的内存是连续的,支持高效的随机访问,适合下标操作。
- 在尾部插入/删除效率高(O(1)均摊),但在中间或头部插入删除较慢(O(n))。
- 频繁插入建议使用 emplace_back 替代 push_back,减少临时对象开销。
- 避免频繁扩容,可提前调用 reserve() 预分配空间。
- 清空 vector 并不释放内存,如需释放可使用 swap 技巧:
std::vector().swap(vec); // 交换后原vec变为空且释放内存 - 不要保存指向 vector 元素的指针或迭代器,在插入可能导致重新分配,使它们失效。











