news 2026/10/31 17:33:19

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_back、resize、reserve、insert等可能导致扩容

  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_back、pop_back、operator[]、size等常用接口

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

  3. OJ练习:

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

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

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

    • 电话号码字母组合

八、总结

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

  • 理解其底层是动态数组

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

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

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

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

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

C++ STL容器适配器深度解析:stack、queue与priority_queue

目录 &#x1f4da; 一、容器适配器概述 1.1 什么是容器适配器&#xff1f; 1.2 核心特点 &#x1f5c3;️ 二、stack&#xff08;栈&#xff09; 2.1 栈的基本概念 2.2 栈的接口 2.3 栈的经典应用 2.3.1 最小栈&#xff08;MinStack&#xff09; 2.3.2 栈的弹出/压入…

作者头像 李华
网站建设 2026/10/29 15:48:38

I2S音频传输原理:一文说清其工作机制与优势

I2S音频传输原理&#xff1a;从信号线到高保真&#xff0c;一文讲透它的底层逻辑与实战要点 你有没有想过&#xff0c;为什么同样是数字音频接口&#xff0c;I2S能成为消费电子、专业音响甚至汽车座舱里的“标配”&#xff1f;而SPI、UART这些通用串行协议却很少用于高质量音频…

作者头像 李华
网站建设 2026/10/30 1:06:40

如何利用TensorRT实现模型推理过程追溯?

如何利用TensorRT实现模型推理过程追溯&#xff1f; 在现代AI系统中&#xff0c;部署一个训练好的深度学习模型只是第一步。真正挑战在于&#xff1a;当模型上线后出现性能波动、延迟飙升甚至输出异常时&#xff0c;我们能否快速定位问题根源&#xff1f;尤其是在使用了高度优化…

作者头像 李华
网站建设 2026/10/28 23:52:10

使用TensorRT加速SLAM算法中深度学习模块

使用TensorRT加速SLAM算法中深度学习模块 在机器人自主导航、无人机飞行控制和增强现实交互等实时系统中&#xff0c;同步定位与地图构建&#xff08;SLAM&#xff09;的性能直接决定了整个系统的可用性。传统基于几何特征的SLAM方法虽然高效稳定&#xff0c;但在弱纹理、动态环…

作者头像 李华
网站建设 2026/11/1 3:28:59

大模型推理服务灰度回滚机制设计

大模型推理服务灰度回滚机制设计 在当前大模型&#xff08;LLM&#xff09;广泛应用于智能客服、内容生成和代码辅助的背景下&#xff0c;推理服务的稳定性已不再仅仅是性能问题&#xff0c;而是直接关系到用户体验与业务连续性的核心命脉。一个看似微小的模型更新&#xff0c;…

作者头像 李华
网站建设 2026/10/30 1:56:16

Multisim环境下74194功能验证:核心要点图解说明

在Multisim中玩转74194&#xff1a;从原理到仿真&#xff0c;一文打通双向移位寄存器的任督二脉你有没有遇到过这样的情况&#xff1f;想做个LED流水灯&#xff0c;却卡在“怎么让数据自动左移右移”上&#xff1b;学数字电路时&#xff0c;老师讲完S0、S1控制模式&#xff0c;…

作者头像 李华