【C++STL之vector】vector容器浅析

news2025/4/21 8:39:26

文章目录

  • 🌟 深入探索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();     // 输出1000

vector<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与其他容器的华山论剑

特性vectordequelist
随机访问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]);
        else
            res.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这把利器所向披靡!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2310718.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis的持久化-RDBAOF

文章目录 一、 RDB1. 触发机制2. 流程说明3. RDB 文件的处理4. RDB 的优缺点 二、AOF1. 使用 AOF2. 命令写⼊3. 文件同步4. 重写机制5 启动时数据恢复 一、 RDB RDB 持久化是把当前进程数据生成快照保存到硬盘的过程&#xff0c;触发 RDB 持久化过程分为手动触发和自动触发。 …

Redis 的几个热点知识

前言 Redis 是一款内存级的数据库&#xff0c;凭借其卓越的性能&#xff0c;几乎成为每位开发者的标配工具。 虽然 Redis 包含大量需要掌握的知识&#xff0c;但其中的热点知识并不多。今天&#xff0c;『知行』就和大家分享一些 Redis 中的热点知识。 Redis 数据结构 Redis…

靶场之路-VulnHub-DC-6 nmap提权、kali爆破、shell反连

靶场之路-VulnHub-DC-6 一、信息收集 1、扫描靶机ip 2、指纹扫描 这里扫的我有点懵&#xff0c;这里只有两个端口&#xff0c;感觉是要扫扫目录了 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的模板匹配工具&#xff0c;便于在客户端软件中…

【3DMAX室内设计】2D转3D平面图插件2Dto3D使用方法

【一键筑梦】革新性2Dto3D插件&#xff0c;轻松实现2D平面图向3D空间的华丽蜕变。这款专为3DMAX室内设计师设计的神器&#xff0c;集一键式墙体、门、窗自动生成功能于一身&#xff0c;能够将2D图形无缝转化为3D网格对象&#xff08;3D平面图、鸟瞰图&#xff09;&#xff0c;一…

vscode 查看3d

目录 1. vscode-3d-preview obj查看ok 2. vscode-obj-viewer 没找到这个插件&#xff1a; 3. 3D Viewer for Vscode 查看obj失败 1. vscode-3d-preview obj查看ok 可以查看obj 显示过程&#xff1a;开始是绿屏&#xff0c;过了1到2秒&#xff0c;后来就正常看了。 2. vsc…

自动驾驶---不依赖地图的大模型轨迹预测

1 前言 早期传统自动驾驶方案通常依赖高精地图&#xff08;HD Map&#xff09;提供道路结构、车道线、交通规则等信息&#xff0c;可参考博客《自动驾驶---方案从有图迈进无图》&#xff0c;本质上还是存在问题&#xff1a; 数据依赖性高&#xff1a;地图构建成本昂贵&#xf…

perl初试

我手头有一个脚本&#xff0c;用于从blastp序列比对的结果文件中&#xff0c;进行文本处理&#xff0c; 获取序列比对最优的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 模块的实现原理和关键代码。这个模块主要用于捕获网页完整截图&#xff0c;特别优化了对动态加载内容的处理。 1. 模块概述 snapshot.py 是一个功能完整的网页截图工具&#xff0c;它使用 Selenium 和 Chrome WebDriver 来模拟真实浏览器行为&am…

Windows 10 下 SIBR Core (i.e. 3DGS SIBR Viewers) 的编译

本文针对在 Windows 10 上从源码编译安装3DGS &#xff08;3D Gaussian Splatting&#xff09;的Viewers 即SIBR Core及外部依赖库extlibs&#xff08;预编译的版本直接在页面https://sibr.gitlabpages.inria.fr/download.html下载&#xff09; &#xff0c;参考SIBR 的官方网站…

JavaWeb-HttpServletRequest请求域接口

文章目录 HttpServletRequest请求域接口HttpServletRequest请求域接口简介关于请求域和应用域的区别 请求域接口中的相关方法获取前端请求参数(getParameter系列方法)存储请求域名参数(Attribute系列方法)获取客户端的相关地址信息获取项目的根路径 关于转发和重定向的细致剖析…

防火墙虚拟系统实验

拓扑图 需求一 安全策略要求&#xff1a; 1、只存在一个公网IP地址&#xff0c;公司内网所有部门都需要借用同一个接口访问外网 2、财务部禁止访问Internet&#xff0c;研发部门只有部分员工可以访问Internet&#xff0c;行政部门全部可以访问互联网 3、为三个部门的虚拟系统分…

点云滤波方法:特点、作用及使用场景

点云滤波是点云数据预处理的重要步骤&#xff0c;目的是去除噪声点、离群点等异常数据&#xff0c;平滑点云或提取特定频段特征&#xff0c;为后续的特征提取、配准、曲面重建、可视化等高阶应用打下良好基础。以下是点云中几种常见滤波方法的特点、作用及使用场景&#xff1a;…

Gradle 配置 Lombok 项目并发布到私有 Maven 仓库的完整指南

Gradle 配置 Lombok 项目并发布到私有 Maven 仓库的完整指南 在 Java 项目开发中&#xff0c;使用 Lombok 可以极大地减少样板代码&#xff08;如 getter/setter 方法、构造器等&#xff09;&#xff0c;提高开发效率。然而&#xff0c;当使用 Gradle 构建工具并将项目发布到私…

ArcGIS Pro 基于基站数据生成基站扇区地图

在当今数字化的时代&#xff0c;地理信息系统&#xff08;GIS&#xff09;在各个领域都发挥着至关重要的作用。 ArcGIS Pro作为一款功能强大的GIS软件&#xff0c;为用户提供了丰富的工具和功能&#xff0c;使得数据处理、地图制作和空间分析变得更加高效和便捷。 本文将为您…

【Python · Pytorch】Conda介绍 DGL-cuda安装

本文仅涉及DGL库介绍与cuda配置&#xff0c;不包含神经网络及其训练测试。 起因&#xff1a;博主电脑安装了 CUDA 12.4 版本&#xff0c;但DGL疑似没有版本支持该CUDA版本。随即想到可利用Conda创建CUDA12.1版本的虚拟环境。 1. Conda环境 1.1 Conda环境简介 Conda&#xff1…

leetcode:2965. 找出缺失和重复的数字(python3解法)

难度&#xff1a;简单 给你一个下标从 0 开始的二维整数矩阵 grid&#xff0c;大小为 n * n &#xff0c;其中的值在 [1, n2] 范围内。除了 a 出现 两次&#xff0c;b 缺失 之外&#xff0c;每个整数都 恰好出现一次 。 任务是找出重复的数字a 和缺失的数字 b 。 返回一个下标从…

Android U 分屏——SystemUI侧处理

WMShell相关的dump命令 手机分屏启动应用后运行命令&#xff1a;adb shell dumpsys activity service SystemUIService WMShell 我们可以找到其中分屏的部分&#xff0c;如下图所示&#xff1a; 分屏的组成 简图 分屏是由上分屏(SideStage)、下分屏(MainStage)以及分割线组…

flink集成tidb cdc

Flink TiDB CDC 详解 1. TiDB CDC 简介 1.1 TiDB CDC 的核心概念 TiDB CDC 是 TiDB 提供的变更数据捕获工具&#xff0c;能够实时捕获 TiDB 集群中的数据变更&#xff08;如 INSERT、UPDATE、DELETE 操作&#xff09;&#xff0c;并将这些变更以事件流的形式输出。TiDB CDC 的…