news 2026/4/23 0:42:43

C++ Vector 全解析:从使用到深入理解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++ Vector 全解析:从使用到深入理解

目录

一、Vector 是什么?

二、Vector 的基本使用

2.1 构造与初始化

2.2 迭代器使用

2.3 容量操作

三、Vector 的增删查改

3.1 基本操作

四、迭代器失效问题(重点!)

4.1 导致迭代器失效的操作

4.2 错误示例

4.3 正确做法

五、Vector 在算法题中的应用

5.1 只出现一次的数字(异或技巧)

5.2 杨辉三角

六、Vector 的模拟实现注意事项

6.1 深拷贝问题

6.2 动态二维数组

七、实战练习建议

八、总结


一、Vector 是什么?

vector是 C++ 标准模板库(STL)中的一个动态数组容器,它能够根据需要自动调整大小,支持快速随机访问,是 C++ 中最常用的容器之一。

二、Vector 的基本使用

2.1 构造与初始化

cpp

#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()); // 迭代器范围构造

2.2 迭代器使用

cpp

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 << " "; }

2.3 容量操作

cpp

vector<int> v; cout << v.size(); // 元素个数 cout << v.capacity(); // 当前容量 cout << v.empty(); // 是否为空 v.reserve(100); // 预留至少100个元素的空间 v.resize(50); // 调整大小为50,多出的用默认值填充

注意:不同编译器下vector的扩容策略不同:

  • VS 下按 1.5 倍增长

  • g++ 下按 2 倍增长

三、Vector 的增删查改

3.1 基本操作

cpp

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发生某些操作后,之前获取的迭代器指向的内存可能已经无效。

4.1 导致迭代器失效的操作

  1. 扩容操作push_backresizereserveinsert等可能导致扩容

  2. 删除操作erase删除元素

  3. 赋值操作assign

4.2 错误示例

cpp

vector<int> v = {1, 2, 3, 4}; auto it = v.begin(); v.push_back(5); // 可能导致扩容,it失效! // 错误!it可能指向已释放的内存 while (it != v.end()) { cout << *it << " "; ++it; }

4.3 正确做法

cpp

// 删除所有偶数 - 正确写法 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; } }

五、Vector 在算法题中的应用

5.1 只出现一次的数字(异或技巧)

cpp

int singleNumber(vector<int>& nums) { int value = 0; for (auto e : nums) { value ^= e; // 利用 a^a=0 的特性 } return value; }

5.2 杨辉三角

cpp

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 的模拟实现注意事项

6.1 深拷贝问题

在模拟实现vector时,reserve中不能使用memcpy来拷贝元素,尤其是元素类型涉及资源管理(如string)时:

cpp

// 错误!浅拷贝会导致问题 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=或拷贝构造 }

6.2 动态二维数组

cpp

// 创建n行的二维数组 vector<vector<int>> vv(n); // 每行设置不同大小 for (int i = 0; i < n; ++i) { vv[i].resize(i + 1, 1); }

七、实战练习建议

  1. 基础操作:熟练掌握push_backpop_backoperator[]size等常用接口

  2. 迭代器理解:理解迭代器失效的原因及解决方案

  3. OJ练习

    • 删除排序数组中的重复项

    • 只出现一次的数字 II/III

    • 数组中出现次数超过一半的数字

    • 电话号码字母组合

八、总结

vector是 C++ 中最实用、最高效的容器之一,掌握它需要:

  • 理解其底层是动态数组

  • 熟悉常用接口的使用场景

  • 特别注意迭代器失效问题

  • 了解不同编译器下的扩容策略差异

通过理论学习和实际编码练习相结合,你一定能熟练掌握vector,为后续的 C++ 学习和开发打下坚实基础!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/22 13:58:28

大模型推理服务灰度发布Checklist

大模型推理服务灰度发布Checklist 在大模型应用日益深入生产环境的今天&#xff0c;如何安全、高效地将新版本模型推上线&#xff0c;成为AI工程团队面临的核心挑战之一。一个微小的性能退化或稳定性问题&#xff0c;可能在高并发场景下被迅速放大&#xff0c;导致用户体验下降…

作者头像 李华
网站建设 2026/4/23 3:42:12

智能手机bootloader模式下fastboot驱动工作流程解析

深入理解智能手机的Fastboot机制&#xff1a;从Bootloader到刷机全过程实战解析你有没有过这样的经历&#xff1f;手机变砖、系统无法启动&#xff0c;ADB进不去&#xff0c;应用打不开——但只要一条fastboot flash boot boot.img命令&#xff0c;设备就“起死回生”了。这背后…

作者头像 李华
网站建设 2026/4/23 9:27:57

基于TensorRT的智能电网故障预警系统

基于TensorRT的智能电网故障预警系统 在现代电力系统的运行中&#xff0c;一次突发短路或设备劣化可能引发连锁反应&#xff0c;轻则造成局部停电&#xff0c;重则导致区域级电网震荡。传统基于阈值和统计模型的故障检测手段&#xff0c;往往只能“事后响应”&#xff0c;难以捕…

作者头像 李华
网站建设 2026/4/23 12:14:14

rs232串口调试工具数据帧解析的系统学习路径

从波形到协议&#xff1a;如何真正“看懂”RS232串口通信当你的串口输出全是乱码时&#xff0c;你在调试什么&#xff1f;你有没有过这样的经历&#xff1f;嵌入式板子一上电&#xff0c;打开XCOM、SSCOM或者PuTTY&#xff0c;屏幕上刷出一堆~[之类的字符&#xff0c;像是某种外…

作者头像 李华
网站建设 2026/4/22 20:22:20

嵌入式开发环境搭建:STM32CubeMX安装核心要点

从零开始搭建STM32开发环境&#xff1a;STM32CubeMX安装避坑全指南 你有没有遇到过这样的情况&#xff1f; 刚下定决心入手STM32&#xff0c;兴致勃勃地下载了STM32CubeMX&#xff0c;结果双击图标却弹出一个黑框闪退&#xff1b;或者启动后卡在“Loading”界面&#xff0c;提…

作者头像 李华
网站建设 2026/4/23 12:13:42

Proteus示波器方波时序分析:项目实战示例

用Proteus示波器“解剖”方波&#xff1a;一次真实的时序实战你有没有遇到过这样的情况&#xff1f;MCU输出的PWM信号明明配置成1kHz&#xff0c;接上电机却发现转速不对&#xff1b;或者555定时器搭了个振荡电路&#xff0c;结果LED闪烁频率和计算值差了一大截。这时候你会想&…

作者头像 李华