内部数组所占的物理空间的容量,若在向量的生命期内不允许调整,则称作静态空间管理策略。

向量的实际规模与其内部的数组容量的比值(_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;

}

静态空间管理和动态空间管理相关推荐

  1. 从结构体、内存池初始化到申请释放,详细解读鸿蒙轻内核的动态内存管理

    摘要:本文带领大家一起剖析了鸿蒙轻内核的动态内存模块的源代码,包含动态内存的结构体.动态内存池初始化.动态内存申请.释放等. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列九 动态内存Dyna ...

  2. RT-Thread 动态内存管理(学习笔记)

    本文参考自[野火EmbedFire]<RT-Thread内核实现与应用开发实战--基于STM32>,仅作为个人学习笔记.更详细的内容和步骤请查看原文(可到野火资料下载中心下载) 文章目录 ...

  3. 小夕说,不了解动态空间增长的程序喵都是假喵(下)

    小夕在本系列前两篇文章中为大家介绍了各类数据结构的扩容策略,且在上篇文末,小夕提到了加倍式扩容中,倍率采用2并不是最优的,为什么呢?有没有最优倍率呢? 内存复用 如果倍率采用2甚至更大的数,那么被开辟 ...

  4. 【人员产量动态看板管理】

    恒兴源科生产看板管理-生产动态看板管理 生产人员日产量实时显示(看板管理) 按线别实时显示每条拉线人员的实时产出,结合生产记件扫码系统,实时显示新的人员产量信息. 为生产管理人员提供人员产能实时数据.

  5. 动态内存管理(开辟以及释放动态内存空间)

    文章目录 前言 malloc函数 calloc函数 realloc函数 free函数 - 避免内存泄漏 常见的动态内存错误 前言 如果我们被问道:如何创建一个可以根据用户需求来开辟大小的数组? 可能有 ...

  6. Oracle本地管理的表空间

    本地管理(locally managed)的表空间使用在每个数据文件中存储的位图(bitmpa)来管理区(extents). 本地管理的表空间通过使用位图来跟踪表空间的所有区的信息. 本地管理表空间提 ...

  7. Oracle在线撤销表空间,创办、管理撤销表空间

    撤销管理模式: 用户通过设定撤销管理模式(undo mode)就可以灵活地选择使用手动撤销管理(manual undo management)或自动撤销管理(automatic undo manage ...

  8. 在请求分页虚存管理系统中_请求分页式系统中,以页为单位管理用户的虚空间,以段为单位管理内存空间_学小易找答案...

    [简答题]OS作为接口,通过哪几种方式实现? [简答题]并发与并行有什么区别? [判断题]请求分页式系统中,以页为单位管理用户的虚空间,以段为单位管理内存空间 [简答题]微内核是否是完整的OS? [单 ...

  9. 本地区间管理 oracle,Oracle:本地表空间管理,字典表空间管理

    本地管理表空间 一.概述 1.理解本地管理表空间的由来 2.理解什么是字典管理表空间及工作原理 3.理解本地管理表空间的优势(为什么要使用本地管理表空间) 4.理解本地管理表空间的内部结构 5.理解字 ...

  10. rac下asm管理的表空间-数据文件的重命名

    asm下表空间的重命名与普通文件系统下的表空间重命名原理是一样的,只不过asm管理的数据文件有一些需要注意的地方,另外在asm下操作数据文件需要格外小心,稍有不慎将会造成数据文件丢失,如可以做备份最好 ...

最新文章

  1. 简而言之,JUnit:测试隔离
  2. jQuery常用的元素查找方法总结 .
  3. Oracle生成流水号函数
  4. mvc npoi将List实体导出excel的最简单方法
  5. php无法上传,为什么php 大文件无法上传
  6. 软件技术基础复习提纲
  7. windows资源管理器管理工具Qttabbar个人使用总结
  8. 服务器gpt安装系统bios设置,系统安装的两种模式:UEFI+GPT、BIOS+MBR-网络教程与技术 -亦是美网络...
  9. SuiteCRM图片上传(自定义控制器)
  10. 【算法】【递归与动态规划模块】两个字符串的最长公共子数组
  11. 如何实现在线直播源码的美颜功能——接入美颜SDK
  12. CSS真好玩——用纯CSS画一轮新月
  13. 笔记本外接显示器感觉鼠标有延迟解决办法
  14. Redis基础 -- 地理坐标类型 Redis GEO 和 Redis GEO的常用命令(含GEOHASH编码说明)
  15. python中byte2array报错_python基础-bytes和bytearray的用法
  16. Python高效替代Excel了,你会吗?
  17. STM32F103(一):ADC
  18. 解决win10快捷键打开程序延时问题
  19. 按键精灵--------后台插件
  20. 成功进行射频与模拟混合信号PCB设计需要考虑的因素

热门文章

  1. java计算机毕业设计咖啡馆管理系统源程序+mysql+系统+lw文档+远程调试
  2. 量子计算机ai出现意识,人工智能到底会不会出现自我意识?会不会消灭人类?...
  3. wordpress企业主题安装
  4. B2065 鸡尾酒疗法
  5. 【VMware】XP安装VMware Tools
  6. 字节序——Big Endian和Little Endian
  7. W3C 验证的是是非非
  8. 从零开始的运维之路【标题党】
  9. HTML基础常识问答(二)
  10. 【软件工程实践】Pig项目1-什么是Pig