静态空间管理和动态空间管理
内部数组所占的物理空间的容量,若在向量的生命期内不允许调整,则称作静态空间管理策略。
向量的实际规模与其内部的数组容量的比值(_size/_capacity),亦称作装填因子(他是衡量空间利用率的重要指标)
所以如何才能保证向量的装填因子既不至于超过1,也不至于太接近0,这时候需要动态空间管理了。
template<typename T> void vector<T> : : expend(){ //向量空间不足是扩容
if(_size<_capacity) return ;//容量够用时不扩容
if(_capacity<DEFAULT_CAPACITY) _capacity=DEFAULT_CAPACITY;//不低于最小容量
T*oldElem=_elem; _elem= new T[_capacity<<=1];//容量加倍
for(int i=0;i<_size;i++)
_elem[i]=oldElem[i];//复制原向量内容(T为基本类型,或已重载赋值操作符'=')
delete[] oldElem;//释放空间
}
按照上述程序,每进行一次扩容,其容量都会加倍。但需要至少进行n次插入操作,才会因为可能溢出而再次扩容。随着向量规模的不断扩大,在执行插入操作之前需要进行扩容的概率,也将迅速降低。所以就某种平均意义而言,用于扩容的时间成本不至于很高。这里就引入了分摊复杂度进行说明。
将程序所消耗的时间,分摊至所有的操作。这样分摊平均至单次操作的时间成本,称为分摊运行时间。
因为在足够长的连续操作序列中,以任何固定间隔连续出现上述最坏情况的概率为0,故常规的平均复杂度不具有参考意义。
size(n) = 连续插入n个元素后向量的规模
capacity(n)=连续插入n个元素后数组的容量
T(n)=为连续插入n个元素而花费于扩容的时间
size(n)<=capacity(n)<2*size(n)
capacity(n)=
容量以2为比例按指数速度增长,在容量达到capacity(n)之前,共做过次
所有T(n)=2N+4N+8N+......+capacity(n)<2*capacity(n)=
将其分摊到其间的连续n次操作,单次操作所需的分摊运行时间应为
另一个导致低效率的情况是,向量的实际规模可能远远小于内部数组的容量。比如在连续的一系列操作过程中,若删除操作远多于插入操作,则装填因子可能远远小于100%,甚至非常接近与0.当装填因子低于某一阈值时,我们称数组发生了下溢。
这时候就要用缩容
template<typename T> void vector<T>::shrink(){
if(_capacity<DEFAULT_CAPACITY<<1) return ;//不致收缩到DEFAULT_CAPACITY以下
if(_size<<2>_capacity) return ;//以25%为界
T*_oldelem=_elem ;
_elem=new T[_capacity>>=1];//容量减半
for(int i=0;i<_size;i++) _elem[i]=_oldelem[i];
delete[] oldelem;
}
静态空间管理和动态空间管理相关推荐
- 从结构体、内存池初始化到申请释放,详细解读鸿蒙轻内核的动态内存管理
摘要:本文带领大家一起剖析了鸿蒙轻内核的动态内存模块的源代码,包含动态内存的结构体.动态内存池初始化.动态内存申请.释放等. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列九 动态内存Dyna ...
- RT-Thread 动态内存管理(学习笔记)
本文参考自[野火EmbedFire]<RT-Thread内核实现与应用开发实战--基于STM32>,仅作为个人学习笔记.更详细的内容和步骤请查看原文(可到野火资料下载中心下载) 文章目录 ...
- 小夕说,不了解动态空间增长的程序喵都是假喵(下)
小夕在本系列前两篇文章中为大家介绍了各类数据结构的扩容策略,且在上篇文末,小夕提到了加倍式扩容中,倍率采用2并不是最优的,为什么呢?有没有最优倍率呢? 内存复用 如果倍率采用2甚至更大的数,那么被开辟 ...
- 【人员产量动态看板管理】
恒兴源科生产看板管理-生产动态看板管理 生产人员日产量实时显示(看板管理) 按线别实时显示每条拉线人员的实时产出,结合生产记件扫码系统,实时显示新的人员产量信息. 为生产管理人员提供人员产能实时数据.
- 动态内存管理(开辟以及释放动态内存空间)
文章目录 前言 malloc函数 calloc函数 realloc函数 free函数 - 避免内存泄漏 常见的动态内存错误 前言 如果我们被问道:如何创建一个可以根据用户需求来开辟大小的数组? 可能有 ...
- Oracle本地管理的表空间
本地管理(locally managed)的表空间使用在每个数据文件中存储的位图(bitmpa)来管理区(extents). 本地管理的表空间通过使用位图来跟踪表空间的所有区的信息. 本地管理表空间提 ...
- Oracle在线撤销表空间,创办、管理撤销表空间
撤销管理模式: 用户通过设定撤销管理模式(undo mode)就可以灵活地选择使用手动撤销管理(manual undo management)或自动撤销管理(automatic undo manage ...
- 在请求分页虚存管理系统中_请求分页式系统中,以页为单位管理用户的虚空间,以段为单位管理内存空间_学小易找答案...
[简答题]OS作为接口,通过哪几种方式实现? [简答题]并发与并行有什么区别? [判断题]请求分页式系统中,以页为单位管理用户的虚空间,以段为单位管理内存空间 [简答题]微内核是否是完整的OS? [单 ...
- 本地区间管理 oracle,Oracle:本地表空间管理,字典表空间管理
本地管理表空间 一.概述 1.理解本地管理表空间的由来 2.理解什么是字典管理表空间及工作原理 3.理解本地管理表空间的优势(为什么要使用本地管理表空间) 4.理解本地管理表空间的内部结构 5.理解字 ...
- rac下asm管理的表空间-数据文件的重命名
asm下表空间的重命名与普通文件系统下的表空间重命名原理是一样的,只不过asm管理的数据文件有一些需要注意的地方,另外在asm下操作数据文件需要格外小心,稍有不慎将会造成数据文件丢失,如可以做备份最好 ...
最新文章
- 简而言之,JUnit:测试隔离
- jQuery常用的元素查找方法总结 .
- Oracle生成流水号函数
- mvc npoi将List实体导出excel的最简单方法
- php无法上传,为什么php 大文件无法上传
- 软件技术基础复习提纲
- windows资源管理器管理工具Qttabbar个人使用总结
- 服务器gpt安装系统bios设置,系统安装的两种模式:UEFI+GPT、BIOS+MBR-网络教程与技术
-亦是美网络...
- SuiteCRM图片上传(自定义控制器)
- 【算法】【递归与动态规划模块】两个字符串的最长公共子数组
- 如何实现在线直播源码的美颜功能——接入美颜SDK
- CSS真好玩——用纯CSS画一轮新月
- 笔记本外接显示器感觉鼠标有延迟解决办法
- Redis基础 -- 地理坐标类型 Redis GEO 和 Redis GEO的常用命令(含GEOHASH编码说明)
- python中byte2array报错_python基础-bytes和bytearray的用法
- Python高效替代Excel了,你会吗?
- STM32F103(一):ADC
- 解决win10快捷键打开程序延时问题
- 按键精灵--------后台插件
- 成功进行射频与模拟混合信号PCB设计需要考虑的因素