C++ 浅谈之 STL Vector
创始人
2024-05-24 02:11:17
0

C++ 浅谈之 STL Vector

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

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

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

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


一 🏠 概述

简单介绍

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

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

迭代器

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

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

数据结构

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

template
class vector {
......
protected:iterator start;             //已使用空间的头iterator finish;            //已使用空间的尾iterator end_of_storage;    //可用空间的尾
......
}

vector 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 内部结构,可能导致内存泄露 🎅🎅🎅


三 🏠 结语

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

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

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

相关内容

热门资讯

报告会主持词 【精选】报告会主持词4篇  主持词没有固定的格式,他的最大特点就是富有个性。在当今中国社会,主持成为...
过界男女的经典台词及微影评 过界男女的经典台词及微影评  过界男女经典台词  1、因为李先生的户口被冻结了,所以暂时不能为你办理...
中秋节商务贺卡祝词 中秋节商务贺卡祝词把酝酿已久的创意交给秋风,任其去演绎相思的旋律;让翘盼团聚的心跃上太空,在月宫桂树...
谢师宴酒席致辞 谢师宴酒席致辞(精选5篇)  无论是在学校还是在社会中,说到致辞,大家肯定都不陌生吧,致辞具有“礼仪...
快板书武松打虎台词 快板书武松打虎台词  快板书是起源于山东省汉族传统曲艺形式,具有一百多年的历史。它最早流行于山东、华...
学校元旦晚会开场白主持词 学校元旦晚会开场白主持词  根据活动对象的不同,需要设置不同的主持词。在一步步向前发展的社会中,越来...
长辈证婚人证婚词 长辈证婚人证婚词各位领导、各位来宾、各位朋友、女士先生们:大家好!华灯初放、嘉宾盈门,我怀着兴奋的心...
元宵节主持词 元宵节主持词15篇  主持词要根据活动对象的不同去设置不同的主持词。在如今这个时代,各种场合中活跃现...
宗亲联谊大会主持词 宗亲联谊大会主持词  主持词要注意活动对象,针对活动对象写相应的主持词。在人们越来越多的参与各种活动...
和谐之声新春联欢会主持台词稿 和谐之声新春联欢会主持台词稿  (联欢会开场前60分钟内,所有接待、服务、道具、灯光、音响、服装、化...
遗体告别主持词 2021遗体告别主持词范文(通用5篇)  主持词是各种演出活动和集会中主持人串联节目的串联词。在当下...
颁奖典礼主持词 关于颁奖典礼主持词(通用5篇)  主持词是各种演出活动和集会中主持人串联节目的串联词。在各种集会、活...
高中学生家长会主持词 高中学生家长会主持词汇编  许多家长把注意力集中在孩子的学习上,其实,作为家长更应该从侧面关心孩子的...
公司元旦晚会活动主持词 公司元旦晚会活动主持词  主持词分为会议主持词、晚会主持词、活动主持词、婚庆主持词等。现今社会在不断...
开业主持词 开业主持词龙腾四海,凤舞九天;光辉酒店,鸿业竣开!香飘万家,技艺精湛;四面得利,八方进财!尊敬的各位...
师德师风演讲比赛主持稿 师德师风演讲比赛主持稿范文(通用7篇)  在快速变化和不断变革的今天,很多地方都会使用到主持稿,主持...
结婚仪式主持词 结婚仪式主持词10篇  主持词是各种演出活动和集会中主持人串联节目的串联词。我们眼下的社会,主持人参...
企业年会主持词开场白精选   新年拉近了我们成长的距离,新年染红了我们快乐的生活。下面是CN人才网小编为大家整理的年会主持词开...
教师节座谈会校长致辞 教师节座谈会校长致辞(精选16篇)  在日常学习、工作抑或是生活中,大家对致辞都再熟悉不过了吧,在各...
五一晚会开幕词与闭幕词 五一晚会开幕词与闭幕词  在当今社会生活中,我们经常都会使用到开幕词,开幕词对引导会议或活动顺利进行...