news 2026/6/9 20:08:16

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/6/5 9:11:23

C++ STL list容器深度解析与模拟实现

&#x1f4da; 一、list容器介绍1.1 基本概念list是C标准模板库(STL)中的一个序列容器&#xff0c;底层实现为带头节点的双向循环链表。这种结构使得list在任意位置插入和删除元素都具有很高的效率。1.2 核心特性双向访问&#xff1a;可以从前后两个方向遍历动态内存&#xff1…

作者头像 李华
网站建设 2026/6/6 21:13:37

大模型推理成本居高不下?TensorRT镜像帮你节省70%开销

大模型推理成本居高不下&#xff1f;TensorRT镜像帮你节省70%开销 在大模型落地越来越普遍的今天&#xff0c;一个现实问题摆在每个AI工程团队面前&#xff1a;为什么训练完的模型一上线&#xff0c;GPU账单就猛增&#xff1f;明明A100卡跑着&#xff0c;QPS却卡在几十&#xf…

作者头像 李华
网站建设 2026/6/5 10:11:15

项目应用:整车厂UDS诊断一致性测试方案

整车厂如何打赢UDS诊断一致性这场“隐形战役”&#xff1f;你有没有遇到过这样的场景&#xff1a;一款新车即将量产&#xff0c;各个ECU陆续到货&#xff0c;测试团队一通操作猛如虎——结果诊断仪连不上某个模块&#xff1b;或是刷写时突然报错“安全访问失败”&#xff0c;查…

作者头像 李华
网站建设 2026/6/5 9:23:53

Keil4下STM32项目移植到其他型号实践指南

Keil4下STM32项目跨型号移植实战全解析在嵌入式开发的日常中&#xff0c;你是否曾遇到这样的场景&#xff1a;原本跑得好好的STM32F103项目突然要迁移到性能更强的STM32F407&#xff1f;或者因为供应链问题不得不换一款引脚兼容但系列不同的芯片&#xff1f;更头疼的是——这一…

作者头像 李华
网站建设 2026/6/5 15:06:30

NVIDIA TensorRT在体育分析中的应用前景

NVIDIA TensorRT在体育分析中的应用前景 在一场职业足球比赛的直播中&#xff0c;导播需要从多个机位中实时选择最佳画面&#xff0c;同时系统要自动识别出关键事件——比如一次精彩的过人、一记远射&#xff0c;或是潜在的犯规动作。这些看似即时的操作背后&#xff0c;是一整…

作者头像 李华
网站建设 2026/6/5 14:23:04

基于TensorRT的智慧农业病虫害识别系统

基于TensorRT的智慧农业病虫害识别系统 在一片广袤的果园里&#xff0c;高清摄像头正持续捕捉着每一片树叶的细微变化。突然&#xff0c;系统检测到几处叶片出现斑点状病变——不到50毫秒后&#xff0c;预警信息已推送至农技人员手机&#xff0c;并自动调度无人机前往定点喷洒药…

作者头像 李华