C++ 浅谈之 STL Vector

news2024/11/25 15:59:47

C++ 浅谈之 STL Vector

HELLO,各位博友好,我是阿呆 🙈🙈🙈

这里是 C++ 浅谈系列,收录在专栏 C++ 语言中 😜😜😜

本系列阿呆将记录一些 C++ 语言重要的语法特性 🏃🏃🏃

OK,兄弟们,废话不多直接开冲 🌞🌞🌞


一 🏠 概述

简单介绍

vector 与 array 相似,区别在于:array是静态空间,vector 可动态扩容

vector<typeName> vt(n_elem);    //vector 可用变量初始化, 会自动扩容
array<typeName, n_elem> arr;    //array n_elem 由常量指定, 不会扩容

迭代器

vector 支持随机存取,其迭代器就是普通指针 👊👊👊

template<class T, class Alloc = alloc>
class vector {
public:
    typedef T value_type;
    typedef value_type* iterator;   //vector的迭代器是普通指针
    ......
}

数据结构

vecotr 所维护线性连续空间, startfinish 标识连续空间被使用范围,end_of_storage 指向连续空间末尾 👦👦👦

template<class T, class Alloc = alloc>
class vector {
......
protected:
    iterator start;             //已使用空间的头
    iterator finish;            //已使用空间的尾
    iterator end_of_storage;    //可用空间的尾
......
}

vector<int> iv(2,9);
iv.push_back(1);
iv.push_back(2);
iv.push_back(3);
iv.push_back(4);

经如上操作,vector 内存及各成员如下图状态 👇👇👇

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OhXiEfwM-1675942285660)(E:\2022年MD文档\2023 年 MD文档\二月\浅谈系列\C++ 浅谈之 STL Vector 底层实现.assets\1675860481321.png)]

的唯一差别在于空间运用的灵活性:array是静态空间,一旦配置就不能改变;vector是动态空间,随着元素的加入,他的内部机制会自动扩充空间以容纳新的元素。vector的实现技术,关键在于对其大小的控制以及重新配置时的数据移动效率 ✌✌✌


二 🏠 核心

动态扩容

当 vector 大小和容量相等(size==capacity)时,再添加元素,就会扩容

1、弃用现用内存空间,申请更大内存空间

2、将原内存空间数据,按原次序移动到新内存空间

3、旧内存空间释放

4、指向新内存空间


SGI-STL 扩容机制,伪代码如下 👇👇👇

// SGI-STL扩容机制
void reserve(size_type n) {
    // 当n大于当前vector的容量时才会扩容,小于等于当前容量则忽略本次操作
    if (capacity() < n) {
        const size_type old_size = size();

        // 使用空间配置器开辟n个新空间,并将旧空间元素拷贝到新空间
        iterator tmp = allocate_and_copy(n, start, finish);

        // 释放旧空间
        // a. 先调用析构函数, 将[start, finish)区间总所有的对象析构完整
        destroy(start, finish);

        // b. 将空间规划给空间配置器
        deallocate();

        // 3. 接收新空间并更新其成员
        start = tmp;
        finish = tmp + old_size;
        end_of_storage = start + n;
    }
}

小优化 :reserve 预分配空间,避免频繁动态扩容 👨‍🚀👨‍🚀👨‍🚀


Vector 迭代器失效场景

① 当插入一个元素后,end 返回迭代器失效

② 当插入一个元素后,造成动态扩容,first 和 end 返回迭代器失效

③ 删除操作 (erase,pop_back) ,指向删除点和后面元素的迭代器失效 🐌🐌🐌


迭代器失效原因

① vector ,维护连续内存,删除一个元素后,其它数据地址可能会发生变化(erase 会返回下一个有效迭代器)

② map、set、multiset、map、multimap,红黑树或平衡二叉树储存数据,删除了一个元素后,树调整,但其它数据的内存地址无变化,各节点指向关系改变(erase 仅被删元素迭代器失效)

③ list 链表型结构,不连续内存,仅被删元素迭代器失效 🐳 🐳 🐳


不适合插入和删除

元素 3 位置插入 0 ,需将 3 4 5 整体向后搬移一个位置,最差情况下时间复杂度为 O(N)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RxOnh9if-1675942285661)(E:\2022年MD文档\2023 年 MD文档\二月\浅谈系列\C++ 浅谈之 STL Vector 底层实现.assets\1675861548920.png)]

vector不适宜做任意位置插入与删除操作,因为插入和删除时需要搬移大量元素:


如何快速释放内存

reserve 只在传入大小比原有内存大时才触发,而 resize 或 clear 仅对容器元素进行析构,容器本身空间不会释放

① swap

vector().swap(v) 用空 vector 与当前 vector 交换(空 vector 是临时变量,出作用域会自动调用析构) 🐋🐋🐋

② shrink_to_fit

释放未使用内存(C++11),先调 clear 清空元素(整个容器都是未使用了),shrink_to_fit 将未使用内存释放

vector 用 memset 清零

memset :将某块内存内容全部设为指定值, 常为新申请内存初始化,

后果 :破坏 vector 内部结构,可能导致内存泄露 🎅🎅🎅


三 🏠 结语

身处于这个浮躁的社会,却有耐心看到这里,你一定是个很厉害的人吧 👍👍👍

各位博友觉得文章有帮助的话,别忘了点赞 + 关注哦,你们的鼓励就是我最大的动力

博主还会不断更新更优质的内容,加油吧!技术人! 💪💪💪

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

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

相关文章

18-考虑柔性负荷的综合能源系统低碳经济优化调度MATLAB程序

参考文献&#xff1a;考虑柔性负荷的综合能源系统低碳经济优化调度_薛开阳考虑用户侧柔性负荷的社区综合能源系统日前优化调度_刘蓉晖主要内容&#xff1a;基础模型参考刘蓉晖的论文&#xff0c;主要做了场景1、2、3&#xff1b;碳交易模型采用薛开阳论文中的。采用CPIEX求解某…

ArcGIS API for JavaScript 4.15系列(2)——Dojo中的dom操作

1、前言 ArcGIS API for JavaScript是基于Dojo框架编写的开发包&#xff0c;因此了解并掌握Dojo的相关基础知识是极为必要的。很多开发者都反馈过一个问题&#xff0c;那就是一看见ArcGIS API for JavaScript里那些奇形怪状的代码就觉得无从下手。有一点必须得承认&#xff1a…

Xshell 安装及使用方法

公网地址&#xff1a;47.XXX.XXX.229 私网地址&#xff1a;172.XXX.128.XXX 用户&#xff1a;root 密码&#xff1a;1234561,百度xshell&#xff0c;下载&#xff0c;安装Xshell 2&#xff0c;填写配置及使用方式 主机&#xff1a;47.XXX.XXX.229 用户&#xff1a;root 密码&a…

SpringCloud学习笔记 - 系统自适应限流 - Sentinel

1. Sentinel 系统自适应限流 Sentinel 系统自适应限流从整体维度对应用入口流量进行控制&#xff0c;结合应用的 Load、CPU 使用率、总体平均 RT、入口 QPS 和并发线程数等几个维度的监控指标&#xff0c;通过自适应的流控策略&#xff0c;让系统的入口流量和系统的负载达到一…

第五十一章 BFS进阶(一)——双端队列广搜

第五十一章 BFS进阶&#xff08;一&#xff09;——双端队列广搜一、原理二、例题1、问题2、分析三、代码一、原理 在介绍双端队列广搜之前&#xff0c;我们先回顾一下堆优化版本的dijkstradijkstradijkstra算法。 在这个算法中&#xff0c;我们使用的是小根堆来找到距离起点…

java基础—Volatile关键字详解

java基础—Volatile关键字详解 文章目录java基础—Volatile关键字详解并发编程的三大特性&#xff1a;volatile的作用是什么volatile如何保证有可见性volatile保证可见性在JMM层面原理volatile保证可见性在CPU层面原理可见性问题的例子volatile如何保证有序性单例模式使用volat…

概率统计·假设检验【正态总体均值的假设检验、正态总体方差的假设检验】

均值假设检验定义 2类错误 第1类错误&#xff08;弃真&#xff09;&#xff1a;当原假设H0为真&#xff0c;观察值却落入拒绝域&#xff0c;因而拒 绝H0这类错误是“以真为假” 犯第一类错误的概率显著性水平α第2类错误&#xff08;取伪&#xff09;&#xff1a;当原假设H0不…

基于参数化模型的3D产品配置器开发

当我被要求为客户创建3D产品配置器时&#xff0c;我想到的第一个平台是 SketchFab。 我是在澳大利亚墨尔本的 SAE 创意媒体学院学习计算机动画时接触到它的。 推荐&#xff1a;使用 NSDT场景设计器 快速搭建 3D场景。 1、基于Sketchfab开发3D产品配置器 SketchFab 是在线共享…

码住!为什么一定要做tiktok小店?赶快来开启爆单模式!

随着短视频和社交电商的结合&#xff0c;商家的变现渠道变得更加宽广。各大平台也开启了直播带货的赛道&#xff0c;在跨境行业中&#xff0c;tiktok小店也是商家们关注的渠道。很多商家也开始做tiktok小店&#xff0c;那我们可以先了解一下这小店的优势。tiktok小店拥有优质的…

并发线程、锁、ThreadLocal

并发编程并发编程Java内存模型&#xff08;JMM&#xff09;并发编程核心问题—可见性、原子性、有序性volatile关键字原子性原子类CAS(Compare-And-Swap 比较并交换)ABA问题Java中的锁乐观锁和悲观锁可重入锁读写锁分段锁自旋锁共享锁/独占锁公平锁/非公平锁偏向锁/轻量级锁/重…

02- pandas 数据库 (机器学习)

pandas 数据库重点: pandas 的主要数据结构: Series (一维数据)与 DataFrame (二维数据)。 pd.DataFrame(data np.random.randint(0,151,size (5,3)), # 生成pandas数据 index [Danial,Brandon,softpo,Ella,Cindy], # 行索引 …

J6412四网口迷你主机折腾虚拟机教程

今天给大家做一个四网口迷你主机折腾虚拟机的安装教程&#xff0c;主机采用的是maxtang大唐NUC J6412 intel i226V四网口的迷你主机&#xff0c;这款主机它是不能直接装上NAS的&#xff0c;必须使用虚拟机系统&#xff0c;近期研究了下然后做了一个教程分享给大家。 首先需要做…

Antd-table全选踩坑记录

目录 一、需求 二、问题 ​编辑三、解决 四、全选选中所有数据而不是当前页 一、需求 最近遇到一个小小的需求&#xff0c;在我们这个项目中&#xff0c;有一个表格需要添加全选删除功能。这还不简单吗&#xff0c;于是我找到andt的官网&#xff0c;咔咔咔一顿cv&#xff0…

「自控元件及线路」14 电子电力技术与功率放大器概述

本节介绍电子电力技术的基本概念 本节介绍PD、SCR、GTR、MOSFET、IGBT等电子电力器件 本节介绍功率放大器的基本概念和线性功率放大器 文章目录电力电子技术概述电能变换电子电力器件功率二极管PD晶闸管SCR功率晶体管GTR功率场效应晶体管PowerMOSFET绝缘栅双极晶体管IGBT功率放…

代码随想录.力扣.二叉树.105/106. 从中序与前序/后序序列构造二叉树

题目&#xff1a; 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 示例 1: 输入: preorder [3,9,20,15,7], inorder [9,3,15,20,7] 输出: [3,9,2…

Notion 笔记Mac及windows客户端汉化

1、 注册/登录账号&#xff1a; https://www.notion.so/zh-cn 2、下载电脑软件应用&#xff1a; https://www.notion.so/desktop 下载完成后&#xff0c;安装到电脑中&#xff0c;界面如下&#xff1a; 3、下载汉化js插件 地址&#xff1a;https://github.com/Reamd7/n…

String、StringBuffer、StringBuilder有什么区别?

第5讲 | String、StringBuffer、StringBuilder有什么区别&#xff1f; 今天我会聊聊日常使用的字符串&#xff0c;别看它似乎很简单&#xff0c;但其实字符串几乎在所有编程语言里都是个特殊的存在&#xff0c;因为不管是数量还是体积&#xff0c;字符串都是大多数应用中的重要…

【PR】源窗口

【PR】源窗口源窗口粗剪源窗口按钮功能标记按钮出入点相关插入与覆盖插入覆盖导出帧使用软件&#xff1a;Premiere2020 源窗口粗剪 我们手上可能有一些很长的视频&#xff0c;但是我就想要其中的几段&#xff0c;这个时候粗剪就很方便&#xff0c;把想要的视频段落剪出来先凑一…

私募证券基金动态-23年1月报

成交量&#xff1a;1月日均7,901.31亿元2023年1月A股两市日均成交7,901.31亿元&#xff0c;环比上升0.33%、同比下降25.18%。1月恰逢春节仅16个交易日&#xff0c;节后2个交易日交易量明显回暖。管理人&#xff1a;新提交备案51家&#xff0c;备案通过21家1月新提交备案申请的5…

分析了 200 个 DeFi 项目,我发现了这些规律

作者&#xff1a;Ren & Heinrich翻译&#xff1a;dongdong在这篇文章中&#xff0c;我分享了我通过分析当前排名前 200 的 DeFi 加密项目的见解。这不是一项学术研究。尽管如此&#xff0c;这些发现对加密货币投资者来说具有附加值。我使用 https://defillama.com/ 的公共数…