【C++STL之vector】vector容器浅析
文章目录
- 🌟 深入探索C++ vector:从青铜到王者的动态数组进阶指南 🌟
- 🚀 开篇:为什么vector是C++程序员的瑞士军刀?
- 🔍 一、vector的本质解密:不只是智能数组那么简单
- 1.1 动态数组的华丽蜕变
- 1.2 底层架构揭秘
- 🛠️ 二、vector十八般武艺全解析
- 2.1 九阳神功——构造与初始化
- 2.2 乾坤大挪移——元素访问的七种武器
- 2.3 北冥神功——容量操作的玄机
- 2.4 独孤九剑——修改操作的致命艺术
- 💡 三、性能优化秘籍:让你的vector飞起来
- 3.1 预分配策略:空间换时间
- 3.2 emplace_back vs push_back
- 3.3 内存管理黑科技
- 🚨 四、致命陷阱:vector使用中的九阴真经
- 4.1 迭代器失效的诅咒
- 4.2 vector<bool>的惊天秘密
- 4.3 二维vector的迷宫
- 🏆 五、终极对决:vector与其他容器的华山论剑
- 🧪 六、实战演练:从LeetCode看vector的威力
- 6.1 旋转矩阵(LeetCode 48)
- 6.2 合并区间(LeetCode 56)
- 🔮 七、未来展望:C++20/23中vector的新魔法
- 7.1 constexpr支持
- 7.2 范围操作优化
- 🎯 终极选择指南:什么时候该使用vector?
- 💎 总结:vector的十二字真言
🌟 深入探索C++ vector:从青铜到王者的动态数组进阶指南 🌟
🚀 开篇:为什么vector是C++程序员的瑞士军刀?
想象一下,你在开发一个游戏需要实时记录玩家得分,或者处理百万级数据需要高效存储——这时候,一个能自由伸缩、操作便捷的智能数组就是你的最佳拍档!这就是我们今天要深入探讨的C++ vector,它不仅是STL中最耀眼的明星容器,更是算法竞赛和工业级开发的常青树!
🔍 一、vector的本质解密:不只是智能数组那么简单
1.1 动态数组的华丽蜕变
vector本质上是一个封装了动态大小数组的顺序容器,它完美解决了传统数组的三大痛点:
- 固定尺寸:vector可自动扩容缩容
- 手动内存管理:自动处理内存分配/释放
- 功能单一:提供丰富的操作方法
1.2 底层架构揭秘
template <class T, class Alloc = allocator<T>>
class vector {
private:T* _start; // 指向数组起始位置T* _finish; // 指向最后一个元素的下一个位置T* _end_of_storage; // 指向分配内存的末尾
};


🛠️ 二、vector十八般武艺全解析
2.1 九阳神功——构造与初始化
// 六脉神剑初始化法
vector<int> v1; // 空vector
vector<int> v2(5, 100); // 5个100的副本
vector<int> v3(v2.begin()+1, v2.end()-1); // 迭代器构造
vector<int> v4 = {1,2,3,4,5}; // C++11初始化列表
vector<vector<int>> matrix(3, vector<int>(4)); // 3x4矩阵
2.2 乾坤大挪移——元素访问的七种武器
| 方法 | 特点 | 安全系数 | 示例 |
|---|---|---|---|
[] | 闪电访问 | ⚠️危险 | v[2] = 5; |
at() | 安全卫士 | ✅安全 | v.at(3) = 10; |
front() | 直取首级 | ⚠️危险 | int a = v.front() |
back() | 尾击专家 | ⚠️危险 | int b = v.back() |
data() | 原始指针 | ☠️高危 | int* p = v.data() |
| 迭代器 | 标准遍历 | ✅安全 | for(auto it=...) |
| 范围for | 现代优雅 | ✅安全 | for(int num : v) |
2.3 北冥神功——容量操作的玄机
vector<int> v;
v.reserve(100); // 预开辟100元素空间(容量100,大小0)
v.resize(50); // 调整大小为50(容量100,大小50,新增元素初始化为0)
v.shrink_to_fit(); // 压缩到刚好容纳当前元素
2.4 独孤九剑——修改操作的致命艺术
招式拆解:
// 见缝插针(插入)
v.insert(v.begin()+2, 666); // 第三位插入666
v.emplace(v.end()-1, 888); // 高效构造插入// 横扫千军(删除)
v.erase(v.begin()+1); // 删除第二个元素
v.erase(v.begin(), v.begin()+3);// 删除前三元素
v.clear(); // 清空战场// 移形换影(交换)
vector<int>().swap(v); // 清空并释放内存
💡 三、性能优化秘籍:让你的vector飞起来
3.1 预分配策略:空间换时间
vector<int> scores;
scores.reserve(1000000); // 预分配百万空间,避免多次扩容
3.2 emplace_back vs push_back
class Player {
public:Player(string name, int level) {...}
};vector<Player> team;
team.push_back(Player("Arthur", 99)); // 需要构造临时对象
team.emplace_back("Merlin", 100); // 直接原地构造
3.3 内存管理黑科技
vector<int> v(1000); // 容量1000
v.resize(100); // 大小100,容量仍为1000
cout << v.capacity(); // 输出1000vector<int>(v).swap(v); // C++98/03释放内存方法
v.shrink_to_fit(); // C++11标准方法
🚨 四、致命陷阱:vector使用中的九阴真经
4.1 迭代器失效的诅咒
vector<int> v = {1,2,3,4,5};
auto it = v.begin() + 3;v.insert(v.begin(), 0); // 导致所有迭代器失效!
// 此时使用it会导致未定义行为
4.2 vector的惊天秘密
vector<bool> flags(8);
flags[3] = true; // 返回的是代理对象,不是bool&!
bool* pb = &flags[2]; // 错误!无法获取地址
4.3 二维vector的迷宫
// 正确初始化5x5矩阵
vector<vector<int>> matrix(5, vector<int>(5)); // 错误示范(所有行指向同一vector)
vector<vector<int>> wrong(5, vector<int>(5));
vector<int> row(5);
vector<vector<int>> danger(5, row);
🏆 五、终极对决:vector与其他容器的华山论剑
| 特性 | vector | deque | list |
|---|---|---|---|
| 随机访问 | O(1) ✅ | O(1) ✅ | O(n) ❌ |
| 头部插入删除 | O(n) ❌ | O(1) ✅ | O(1) ✅ |
| 尾部插入删除 | O(1) ✅ | O(1) ✅ | O(1) ✅ |
| 内存连续性 | 完全连续 ✅ | 分段连续 🟡 | 不连续 ❌ |
| 迭代器失效频率 | 高 ⚠️ | 中 🟡 | 低 ✅ |
| 典型应用场景 | 随机访问频繁 | 两端操作频繁 | 频繁中间插入 |
🧪 六、实战演练:从LeetCode看vector的威力
6.1 旋转矩阵(LeetCode 48)
void rotate(vector<vector<int>>& matrix) {int n = matrix.size();// 转置矩阵for(int i=0; i<n; ++i)for(int j=i; j<n; ++j)swap(matrix[i][j], matrix[j][i]);// 翻转每一行for(int i=0; i<n; ++i)reverse(matrix[i].begin(), matrix[i].end());
}
6.2 合并区间(LeetCode 56)
vector<vector<int>> merge(vector<vector<int>>& intervals) {if(intervals.empty()) return {};sort(intervals.begin(), intervals.end());vector<vector<int>> res;res.push_back(intervals[0]);for(int i=1; i<intervals.size(); ++i){if(res.back()[1] >= intervals[i][0])res.back()[1] = max(res.back()[1], intervals[i][1]);elseres.push_back(intervals[i]);}return res;
}
🔮 七、未来展望:C++20/23中vector的新魔法
7.1 constexpr支持
constexpr vector<int> create_data() {vector<int> v;v.reserve(3);v.push_back(1);v.push_back(2);v.push_back(3);return v;
}
7.2 范围操作优化
vector<int> data = {1,2,3,4,5};
erase(data, 3); // 删除所有3 → {1,2,4,5}
erase_if(data, [](int x){ return x%2 ==0; }); // 删除偶数 → {1,5}
🎯 终极选择指南:什么时候该使用vector?
其实一般情况,什么时候都可以用vector,这取决于自己对于c++中STL的掌握情况,当STL使用熟练之后,代码水平将会上升很多,这时再来实现一些题目要求或是开发要求就会轻松简很多。
💎 总结:vector的十二字真言
“知其所长,明其所短,用之得法” —— 掌握vector的动态扩容机制、连续存储优势,规避迭代器失效陷阱,根据场景灵活选择操作方法,你就能在C++的江湖中,凭借vector这把利器所向披靡!
相关文章:
【C++STL之vector】vector容器浅析
文章目录 🌟 深入探索C vector:从青铜到王者的动态数组进阶指南 🌟🚀 开篇:为什么vector是C程序员的瑞士军刀?🔍 一、vector的本质解密:不只是智能数组那么简单1.1 动态数组的华丽蜕…...
如何通过卷积神经网络(CNN)有效地提取图像的局部特征,并在CIFAR-10数据集上实现高精度的分类?
目录 1. CNN 提取图像局部特征的原理 2. 在 CIFAR - 10 数据集上实现高精度分类的步骤 2.1 数据准备 2.2 构建 CNN 模型 2.3 定义损失函数和优化器 2.4 训练模型 2.5 测试模型 3. 提高分类精度的技巧 卷积神经网络(Convolutional Neural Network, CNN&#…...
Redis的持久化-RDBAOF
文章目录 一、 RDB1. 触发机制2. 流程说明3. RDB 文件的处理4. RDB 的优缺点 二、AOF1. 使用 AOF2. 命令写⼊3. 文件同步4. 重写机制5 启动时数据恢复 一、 RDB RDB 持久化是把当前进程数据生成快照保存到硬盘的过程,触发 RDB 持久化过程分为手动触发和自动触发。 …...
Redis 的几个热点知识
前言 Redis 是一款内存级的数据库,凭借其卓越的性能,几乎成为每位开发者的标配工具。 虽然 Redis 包含大量需要掌握的知识,但其中的热点知识并不多。今天,『知行』就和大家分享一些 Redis 中的热点知识。 Redis 数据结构 Redis…...
Rust WebAssembly 入门教程
一、开发环境搭建 1. 基础工具安装 # 安装 Rust curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh# 安装 wasm-pack cargo install wasm-pack# 安装开发服务器 cargo install basic-http-server# 安装文件监听工具 cargo install cargo-watch2. VSCode 插件安装…...
靶场之路-VulnHub-DC-6 nmap提权、kali爆破、shell反连
靶场之路-VulnHub-DC-6 一、信息收集 1、扫描靶机ip 2、指纹扫描 这里扫的我有点懵,这里只有两个端口,感觉是要扫扫目录了 nmap -sS -sV 192.168.122.128 PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.4p1 Debian 10deb9u6 (protoc…...
机器视觉开发教程——封装Halcon通用模板匹配工具【含免费教程源码】
目录 引言前期准备Step1 设计可序列化的输入输出集合【不支持多线程】Step2 设计程序框架1、抽象层【IProcess】2、父类【HAlgorithm】3、子类【HFindModelTool】 Step3 设计UI结果展示 引言 通过仿照VisionPro软件二次开发Halcon的模板匹配工具,便于在客户端软件中…...
Android 中 ConstrantLayout 与 RelativeLayout 区别
ConstraintLayout 和 RelativeLayout 都是 Android 开发中常用的布局容器,它们都可以用于构建复杂的用户界面,但在功能、性能、使用方式等方面存在一些区别,下面为你详细介绍: 1. 布局原理 RelativeLayout:RelativeL…...
【3DMAX室内设计】2D转3D平面图插件2Dto3D使用方法
【一键筑梦】革新性2Dto3D插件,轻松实现2D平面图向3D空间的华丽蜕变。这款专为3DMAX室内设计师设计的神器,集一键式墙体、门、窗自动生成功能于一身,能够将2D图形无缝转化为3D网格对象(3D平面图、鸟瞰图),一…...
vscode 查看3d
目录 1. vscode-3d-preview obj查看ok 2. vscode-obj-viewer 没找到这个插件: 3. 3D Viewer for Vscode 查看obj失败 1. vscode-3d-preview obj查看ok 可以查看obj 显示过程:开始是绿屏,过了1到2秒,后来就正常看了。 2. vsc…...
自动驾驶---不依赖地图的大模型轨迹预测
1 前言 早期传统自动驾驶方案通常依赖高精地图(HD Map)提供道路结构、车道线、交通规则等信息,可参考博客《自动驾驶---方案从有图迈进无图》,本质上还是存在问题: 数据依赖性高:地图构建成本昂贵…...
perl初试
我手头有一个脚本,用于从blastp序列比对的结果文件中,进行文本处理, 获取序列比对最优的hit记录 #!/usr/bin/perl -w use strict;my ($blast_out) ARGV; my $usage "This script is to get the best hit from blast output file wit…...
VS Code C++ 开发环境配置
VS Code 是当前非常流行的开发工具. 本文讲述如何配置 VS Code 作为 C开发环境. 本文将按照如下步骤来介绍如何配置 VS Code 作为 C开发环境. 安装编译器安装插件配置工作区 第一个步骤的具体操作会因为系统不同或者方案不同而有不同的选择. 环境要求 首先需要立即 VS Code…...
Web Snapshot 网页截图 模块代码详解
本文将详细解析 Web Snapshot 模块的实现原理和关键代码。这个模块主要用于捕获网页完整截图,特别优化了对动态加载内容的处理。 1. 模块概述 snapshot.py 是一个功能完整的网页截图工具,它使用 Selenium 和 Chrome WebDriver 来模拟真实浏览器行为&am…...
Java TCP 通信:实现简单的 Echo 服务器与客户端
TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输层协议。与 UDP 不同,TCP 保证了数据的顺序、可靠性和完整性,适用于需要可靠传输的应用场景,如文件传输、网页浏览等。本文将基于 Java 实现一个简单的…...
Windows 10 下 SIBR Core (i.e. 3DGS SIBR Viewers) 的编译
本文针对在 Windows 10 上从源码编译安装3DGS (3D Gaussian Splatting)的Viewers 即SIBR Core及外部依赖库extlibs(预编译的版本直接在页面https://sibr.gitlabpages.inria.fr/download.html下载) ,参考SIBR 的官方网站…...
JavaWeb-HttpServletRequest请求域接口
文章目录 HttpServletRequest请求域接口HttpServletRequest请求域接口简介关于请求域和应用域的区别 请求域接口中的相关方法获取前端请求参数(getParameter系列方法)存储请求域名参数(Attribute系列方法)获取客户端的相关地址信息获取项目的根路径 关于转发和重定向的细致剖析…...
【C++】switch 语句编译报错:error: jump to case label
/home/share/mcrockit_3588/prj_linux/../source/rkvpss.cpp: In member function ‘virtual u32 CRkVpss::Control(u32, void*, u32)’: /home/share/mcrockit_3588/prj_linux/../source/rkvpss.cpp:242:8: error: jump to case label242 | case emRkComCmd_DBG_SaveInput:|…...
防火墙虚拟系统实验
拓扑图 需求一 安全策略要求: 1、只存在一个公网IP地址,公司内网所有部门都需要借用同一个接口访问外网 2、财务部禁止访问Internet,研发部门只有部分员工可以访问Internet,行政部门全部可以访问互联网 3、为三个部门的虚拟系统分…...
点云滤波方法:特点、作用及使用场景
点云滤波是点云数据预处理的重要步骤,目的是去除噪声点、离群点等异常数据,平滑点云或提取特定频段特征,为后续的特征提取、配准、曲面重建、可视化等高阶应用打下良好基础。以下是点云中几种常见滤波方法的特点、作用及使用场景:…...
Gradle 配置 Lombok 项目并发布到私有 Maven 仓库的完整指南
Gradle 配置 Lombok 项目并发布到私有 Maven 仓库的完整指南 在 Java 项目开发中,使用 Lombok 可以极大地减少样板代码(如 getter/setter 方法、构造器等),提高开发效率。然而,当使用 Gradle 构建工具并将项目发布到私…...
ArcGIS Pro 基于基站数据生成基站扇区地图
在当今数字化的时代,地理信息系统(GIS)在各个领域都发挥着至关重要的作用。 ArcGIS Pro作为一款功能强大的GIS软件,为用户提供了丰富的工具和功能,使得数据处理、地图制作和空间分析变得更加高效和便捷。 本文将为您…...
【Python · Pytorch】Conda介绍 DGL-cuda安装
本文仅涉及DGL库介绍与cuda配置,不包含神经网络及其训练测试。 起因:博主电脑安装了 CUDA 12.4 版本,但DGL疑似没有版本支持该CUDA版本。随即想到可利用Conda创建CUDA12.1版本的虚拟环境。 1. Conda环境 1.1 Conda环境简介 Conda࿱…...
Spring AI:开启Java开发的智能新时代
目录 一、引言二、什么是 Spring AI2.1 Spring AI 的背景2.2 Spring AI 的目标 三、Spring AI 的核心组件3.1 数据处理3.2 模型训练3.3 模型部署3.4 模型监控 四、Spring AI 的核心功能4.1 支持的模型提供商与类型4.2 便携 API 与同步、流式 API 选项4.3 将 AI 模型输出映射到 …...
leetcode:2965. 找出缺失和重复的数字(python3解法)
难度:简单 给你一个下标从 0 开始的二维整数矩阵 grid,大小为 n * n ,其中的值在 [1, n2] 范围内。除了 a 出现 两次,b 缺失 之外,每个整数都 恰好出现一次 。 任务是找出重复的数字a 和缺失的数字 b 。 返回一个下标从…...
Android U 分屏——SystemUI侧处理
WMShell相关的dump命令 手机分屏启动应用后运行命令:adb shell dumpsys activity service SystemUIService WMShell 我们可以找到其中分屏的部分,如下图所示: 分屏的组成 简图 分屏是由上分屏(SideStage)、下分屏(MainStage)以及分割线组…...
面试基础---MySQL 事务隔离级别与 MVCC 深度解析
MySQL 事务隔离级别与 MVCC 深度解析:原理、实践与源码分析 引言 在高并发的互联网应用中,数据库事务的隔离级别是保证数据一致性和并发性能的关键。MySQL 通过多版本并发控制(MVCC)机制实现了不同的事务隔离级别。本文将深入探…...
第十二届蓝桥杯大学A组java省赛答案整理
货物摆放 题目描述 小蓝有一个超大的仓库,可以摆放很多货物。 现在,小蓝有 nn 箱货物要摆放在仓库,每箱货物都是规则的正方体。小蓝规定了长、宽、高三个互相垂直的方向,每箱货物的边都必须严格平行于长、宽、高。 小蓝希望所…...
浅浅初识AI、AI大模型、AGI
前记:这里只是简单了解,后面有时间会专门来扩展和深入。 当前,人工智能(AI)及其细分领域(如AI算法工程师、自然语言处理NLP、通用人工智能AGI)的就业前景呈现高速增长态势,市场需求…...
flink集成tidb cdc
Flink TiDB CDC 详解 1. TiDB CDC 简介 1.1 TiDB CDC 的核心概念 TiDB CDC 是 TiDB 提供的变更数据捕获工具,能够实时捕获 TiDB 集群中的数据变更(如 INSERT、UPDATE、DELETE 操作),并将这些变更以事件流的形式输出。TiDB CDC 的…...
