一、Vector 是什么?
vector 是 C++ 标准模板库(STL)中的一个动态数组容器,它能够根据需要自动调整大小,支持快速随机访问,是 C++ 中最常用的容器之一。
C++ vector 是 STL 中的动态数组容器,支持自动扩容和随机访问。文章涵盖构造初始化、增删查改操作及容量管理。重点解析迭代器失效场景及正确处理方式,结合异或技巧与杨辉三角等算法案例展示实际应用。模拟实现时需注意深拷贝问题,避免浅拷贝导致的资源泄漏。掌握底层扩容策略有助于优化性能。

vector 是 C++ 标准模板库(STL)中的一个动态数组容器,它能够根据需要自动调整大小,支持快速随机访问,是 C++ 中最常用的容器之一。
#include <vector>
using namespace std;
vector<int> v1; // 空 vector
vector<int> v2(5, 10); // 5 个元素,每个都是 10
vector<int> v3(v2); // 拷贝构造
vector<int> v4(v3.begin(), v3.end()); // 迭代器范围构造
vector<int> v = {1, 2, 3, 4, 5};
// 正向迭代
for (auto it = v.begin(); it != v.end(); ++it) {
cout << *it << " ";
}
// 反向迭代
for (auto it = v.rbegin(); it != v.rend(); ++it) {
cout << *it << " ";
}
vector<int> v;
cout << v.size(); // 元素个数
cout << v.capacity(); // 当前容量
cout << v.empty(); // 是否为空
v.reserve(100); // 预留至少 100 个元素的空间
v.resize(50); // 调整大小为 50,多出的用默认值填充
注意:不同编译器下 vector 的扩容策略不同:
vector<int> v;
// 增
v.push_back(10); // 尾插
v.insert(v.begin(), 5); // 在指定位置插入
// 删
v.pop_back(); // 尾删
v.erase(v.begin()); // 删除指定位置
v.clear(); // 清空
// 查
auto it = find(v.begin(), v.end(), 10); // 查找元素
if (it != v.end()) {
cout << "找到了";
}
// 改
v[0] = 100; // 像数组一样访问
迭代器失效是使用 vector 时最容易出错的问题之一。简单说,就是当 vector 发生某些操作后,之前获取的迭代器指向的内存可能已经无效。
push_back、resize、reserve、insert 等可能导致扩容erase 删除元素assignvector<int> v = {1, 2, 3, 4};
auto it = v.begin();
v.push_back(5); // 可能导致扩容,it 失效!
// 错误!it 可能指向已释放的内存
while (it != v.end()) {
cout << *it << " ";
++it;
}
// 删除所有偶数 - 正确写法
vector<int> v = {1, 2, 3, 4, 5};
auto it = v.begin();
while (it != v.end()) {
if (*it % 2 == 0) {
it = v.erase(it); // erase 返回下一个有效迭代器
} else {
++it;
}
}
int singleNumber(vector<int>& nums) {
int value = 0;
for (auto e : nums) {
value ^= e; // 利用 a^a=0 的特性
}
return value;
}
vector<vector<int>> generate(int numRows) {
vector<vector<int>> vv(numRows);
for (int i = 0; i < numRows; ++i) {
vv[i].resize(i + 1, 1); // 每行初始化为 1
for (int j = 1; j < i; ++j) {
vv[i][j] = vv[i-1][j] + vv[i-1][j-1];
}
}
return vv;
}
在模拟实现 vector 时,reserve 中不能使用 memcpy 来拷贝元素,尤其是元素类型涉及资源管理(如 string)时:
// 错误!浅拷贝会导致问题
void reserve(size_t n) {
// ...
memcpy(_newStart, _start, sizeof(T) * size()); // 危险!
}
// 正确做法:使用循环赋值,调用元素的拷贝构造
for (size_t i = 0; i < size(); ++i) {
_newStart[i] = _start[i]; // 调用 T 的 operator= 或拷贝构造
}
// 创建 n 行的二维数组
vector<vector<int>> vv(n);
// 每行设置不同大小
for (int i = 0; i < n; ++i) {
vv[i].resize(i + 1, 1);
}
push_back、pop_back、operator[]、size 等常用接口vector 是 C++ 中最实用、最高效的容器之一,掌握它需要:

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online