news 2026/5/1 5:11:09

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/13 4:15:45

如何通过TensorRT提升推理服务的审计追踪能力?

如何通过TensorRT提升推理服务的审计追踪能力&#xff1f; 在金融风控系统中&#xff0c;一次模型误判可能导致数百万资金损失&#xff1b;在医疗影像诊断场景里&#xff0c;AI给出的结论需要经得起事后复核。这些高合规性领域对人工智能系统提出了一个尖锐的问题&#xff1a;我…

作者头像 李华
网站建设 2026/4/25 10:30:42

KeilC51和MDK同时安装实战:从零配置双环境完整指南

Keil C51 与 MDK-ARM 共存实战&#xff1a;一文搞定双开发环境配置 你有没有遇到过这样的场景&#xff1f; 手头要维护一个老旧的 8051 单片机项目&#xff0c;同时又要开发基于 STM32 的新设备。想用 Keil&#xff0c;却发现装了 C51 后再装 MDK 出现编译器混乱、工程打不开、…

作者头像 李华
网站建设 2026/4/28 20:13:26

马斯克嘲讽油车的时候,大多数车主却发现修不起电车了

特斯拉的CEO马斯克日前再对燃油车发出激烈言论&#xff0c;认为传统汽车已走向衰落和死亡&#xff0c;这样说法恐怕有失偏颇&#xff0c;原因是他显然没有考虑到消费者对汽车的使用成本是如此看重&#xff0c;其中的制造技术之一的一体化压铸就在国内外引发不小的争论。普遍来说…

作者头像 李华
网站建设 2026/4/26 10:31:00

基于WinDbg下载的内核调试完整指南

深入Windows内核调试&#xff1a;从WinDbg下载到实战排错的完整路径 你有没有遇到过这样的场景&#xff1f;系统毫无征兆地蓝屏&#xff0c;错误码一闪而过&#xff0c;事件查看器里只留下一行模糊的“KERNEL_SECURITY_CHECK_FAILURE”&#xff1b;或者你在开发一个NDIS驱动&am…

作者头像 李华
网站建设 2026/4/23 16:18:40

从零实现STM32开发:Keil5安装教程完整示例

从零搭建STM32开发环境&#xff1a;Keil5安装实战全解析 你是不是也曾对着电脑屏幕发愁——明明下载了Keil5&#xff0c;点击“编译”却提示找不到芯片&#xff1f;插上ST-Link&#xff0c;调试时却弹出“Cannot access target”&#xff1f;别急&#xff0c;这并不是你代码的…

作者头像 李华
网站建设 2026/4/30 12:49:16

智能绩效管理AI平台的大模型应用:架构师的3个落地场景

智能绩效管理AI平台的大模型应用&#xff1a;架构师的3个落地场景 元数据框架 标题 智能绩效管理AI平台的大模型应用&#xff1a;架构师的3个落地场景——从目标对齐到归因推理的智能化闭环设计 关键词 大模型应用&#xff1b;智能绩效管理&#xff1b;目标对齐&#xff1b;因果…

作者头像 李华