1.expan扩容函数的一些理解
1 template <typename T> void Vector<T>::expand() { //向量空间不足时扩容 2 if (_size < _capacity) return; //尚未满员时,不必扩容 3 if (_capacity < DEFAULT_CAPACITY) _capacity = DEFAULT_CAPACITY; //不低于最小容量 4 T* oldElem = _elem; _elem = new T[_capacity <<= 1]; //容量加倍 5 for (int i = 0; i < _size; i++) 6 _elem[i] = oldElem[i]; //复制原向量内容(T为基本类型,或已重载赋值操作符'=') 7 delete[] oldElem; //释放原空间 8 9 }
1.1.为什么选择加倍(两倍)扩容?而不是根据固定容量扩容?(在copyFrom函数中同理申请了双倍空间内存的理由)
这里涉及到了一个成本分摊的概念。
假设我们初始容量为0的vector插入n个元素,这个n个元素可以定义为n=m*I,插入了I次, 固定扩容容量变为m。
(1)如果我们选择根据每次插入的量扩大容量
则最坏的情况可以是每次插入m+1元素,则第1,I+1,2I+1...(m-1)I 次插入的时候扩容 ,这是一个算术级数,时间成本为O(n2),平均到每一次插入的成本应该是O(n)
(2)如果我们选择根据加倍扩容的办法
则最坏的情况可以是在第1,2,4,8,16...次插入时扩容,这是一个几何级数,时间成本为O(n),平均到每一次插入的成本为O(1)
显然,我们选择加倍扩容的办法,比去修改_capacity的值划算!
转载于:https://www.cnblogs.com/Royzzzzz/p/11053771.html
1.expan扩容函数的一些理解相关推荐
- ORACLE时间函数(SYSDATE)深入理解
ORACLE时间函数(SYSDATE)深入理解 加法 select sysdate,add_months(sysdate,12) from dual; --加1年 select sysdate,a ...
- LUA表与函数的深入理解
LUA表与函数的深入理解 local heroInfo = {}--直接打印 table的名字,就会输出该table的内存地址 print("表地址---------------" ...
- memcpy函数_如何理解c语言中的回调函数
在计算机程序设计中,回调函数,或简称回调,是指通过函数参数传递到其它代码的,某一块可执行代码的引用.这一设计允许了底层代码调用在高层定义的子程序. 这段话不是那么好理解,不同语言实现回调的方式有些许不 ...
- java js中 function函数报错_浅析JS中对函数function的理解(基础篇)
正文:我们知道,在js中,函数实际上是一个对象,每个函数都是Function类型的实例,并且都与其他引用类型一样具有属性和方法.因此,函数名实际上是指向函数对象的指针,不与某个函数绑定.在常见的两种定 ...
- php _call call_user_func_array,PHP call_user_func和call_user_func_array函数的简单理解与应用分析...
本文实例讲述了PHP call_user_func和call_user_func_array函数的简单理解与应用.分享给大家供大家参考,具体如下: call_user_func():调用一个回调函数处 ...
- Makefile中wildcard函数的应用理解
文章目录 前言 1 "*"通配符使用场景 2 "*"通配符实例 总结 前言 如果我们想定义一系列比较类似的文件,我们很自然地就想起使用通配符.make 支持三种 ...
- 关于C语言函数的简单理解
关于C语言函数的简单理解 C语言中的函数 在C语言中,函数是构成程序的基本模块.程序的执行从main()函数的入口开始,到main()函数的出口结束,中间循环.往复.迭代的调用一个有一个函数.每个函数 ...
- C语言基础入门48篇_26_身份证号校验程序(以身份证的校验方式是实例加深对数组及函数封装的理解、字符-‘0‘得到字符对应的int类型数字)
本篇根据以二代身份证的校验方式是实例加深对数组及函数封装的理解 1. 第二代身份证号的组成 第二代身份证号为18位,各位数字对应了不同的信息(以下顺序从左往右): AABBCCYYYYMMDDXXXV ...
- linux c语言 getline,C语言中getline()函数的深入理解
我在网上搜了半天getline()函数,大多针对C++的,重载函数比较多,云里雾里的,而且没有实例,反正就是没有自己所需要的getline()函数.所以,自己在Linux下man了一把,并做了测试.g ...
最新文章
- 杰奇程序 php文件设置,JIEQI CMS使用技巧
- mysql max嵌套select_使用嵌套select子式 解决mysql不能叠加使用如max(sum())的问题
- 天平应什么放置_电子天平讲义全解(使用/维护/分类)
- r软件 image画出来的图是颠倒的_如何用Python抠图?试试scikitimage
- python selenium 进入新标签页_python 爬虫之selenium可视化爬虫
- 在pascal环境下学习record
- java拷贝构造函数
- 木疙瘩动画效果视频学习
- 红帽linux挂载光盘_redhat挂载光盘 命令 - 卡饭网
- 怎么把视频转成文字?分享视频转换成文字的3款应用
- C语言写一个猜数字游戏?我只想玩王者荣耀
- 抖音自媒体火爆短视频如何造?
- 在Java里面使用Pairs或者二元组
- 设计师的AI自学之路:用图像识别玩忍术
- C++中sort()排序函数应用
- 电路中的VDD,DVDD,AVDD,VCC,AFVDD,DOVDD,IOVDD的区别
- java+vue的二维码生成,二维码上传服务器,二维码的压缩包下载
- 淘淘商城第86讲——实现商品详情页面静态化方案时,你没遇到过java.lang.IllegalArgumentException或者java.lang.NullPointerException这种异常
- 社会工程学攻击之网站钓鱼
- java对对碰游戏设计报告_手把手带你用Java打造一款对对碰游戏(下篇)
热门文章
- 均线颜色怎么区分_5日均线,20日均线怎么分辨呀?颜色还是什 – 手机爱问
- 计算机在医院管理中的应用,计算机在医院管理中的应用
- c语言课程设计贪吃蛇报告,贪吃蛇C语言课程设计报告.doc
- oracle export utf-8,Linux操作系统下终端乱码的终极解决方案 export LANG=zh_CN.UTF-8 export LANG=en...
- freebsd启动squid时候的visible_hostname错误
- 一种基于Voronoi图的曲边化随机颗粒模型生成方法
- Ghostery – 隐私广告拦截工具
- 我的第一本书现在已经发布了!
- Linux下安装Oracle11G详细过程
- python ffmpeg模块mp4岀错_Python 调用 FFmpeg 提示 module 'ffmpeg' has no attribute 'input' 的解决方法-老唐笔记...