STL之vector中push_back的时间复杂度分析
vector是STL中的一种序列式容器,采用的数据结构为线性连续空间,它以两个迭代器 start 和 finish 分别指向配置得来的连续空间中目前已被使用的范围,并以迭代器end_of_storage 指向整块连续空间(含备用空间)的尾端,结构如下所示:
template Alloc = alloc>class vector { ...protected:iterator start; // 表示目前使用空间的头iterator finish; // 表示目前使用空间的尾iterator end_of_storage; // 表示可用空间的尾...};
我们在使用 vector 时,最常使用的操作恐怕就是插入操作了(push_back),那么当执行该操作时,该函数都做了哪些工作呢?
该函数首先检查是否还有备用空间,如果有就直接在备用空间上构造元素,并调整迭代器 finish,使 vector变大。如果没有备用空间了,就扩充空间,重新配置、移动数据,释放原空间。
其中判断是否有备用空间,就是判断 finish是否与 end_of_storage 相等.如果
finish != end_of_storage,说明还有备用空间,否则已无备用空间。
当执行 push_back 操作,该 vector 需要分配更多空间时,它的容量(capacity)会增大到原来的 m 倍。现在我们来均摊分析方法来计算 push_back 操作的时间复杂度。
假定有 n 个元素,倍增因子为 m。那么完成这 n 个元素往一个 vector 中的push_back操作,需要重新分配内存的次数大约为 logm(n),第 i 次重新分配将会导致复制 m^i (也就是当前的vector.size() 大小)个旧空间中元素,因此 n 次 push_back操作所花费的总时间约为 n*m/(m - 1):
时间复杂度计算
很明显这是一个等比数列.那么 n 个元素,n 次操作,每一次操作需要花费时间为 m / (m - 1),这是一个常量.
所以,我们采用均摊分析的方法可知,vector 中 push_back 操作的时间复杂度为常量时间.
在STL中,vector的每次扩容都是2倍,也就是m=2.这样,n次总的时间约为n*2/(2-1) = 2n;那么每一操作要花的时间就是2,因此是常量级。
参考资料:
《STL源码剖析》侯捷 著
http://cs.stackexchange.com/questions/9380/why-is-push-back-in-c-vectors-constant-amortized
原文链接:http://blog.sina.com.cn/s/blog_a2a6dd380102w73e.html
STL之vector中push_back的时间复杂度分析相关推荐
- C++STL的vector中front(),back(),begin(),end()的用法
一.front( ),back( )的使用 arr.front();返回的是第一个元素的引用. arr.back();返回的的是最后一个元素的引用. 如果定义int c = a.back(),c并不是 ...
- vector中push_back()和emplace_back()的区别
emplace_back() 和 push_back() 的区别,就在于底层实现的机制不同. push_back() 向容器尾部添加元素时,首先会创建这个元素,然后再将这个元素拷贝(调用拷贝构造函数) ...
- 递归算法中的时间复杂度分析
对于一种算法的时间复杂度分析还是特别重要的,在一些非递归算法中,我们仅仅看运算次数最多的那一行代码可能执行多少次就可以,实际就是看在循环中变量的变化,但是对于递归算法中该怎么分析呢?下面介绍几种递归函 ...
- C++:vector中使用.clear()函数
vector.clear()函数并不会把所有元素清零. vector有两个参数,一个是size,表示当前vector容器内存储的元素个数,一个是capacity,表示当前vector在内存中申请的这片 ...
- vector的push_back拷贝构造和空间占用分析
本文同步自:http://zohead.com/archives/vector-push-back-space-copy/ 这两天在实际程序中使用 STL 的 vector push_back 类对象 ...
- C++ STL: 容器vector源码分析
文章目录 前言 vector的核心接口 vector push_back实现 vector 的 Allocator vector 的 push_back 总结 前言 vector 是我们C++STL中 ...
- vector中的push_back(涉及到动态分配),resize,reserve,swap方法解析
目录 一.vector的push_back解析 二.size和capacity 三.resize和reserve 1.resize 2.reserve 四.关于reserve的应用 五.内存释放 sw ...
- 关于c++中vector的push_back、拷贝构造copy constructor和移动构造move constructor
问题来自C++ Primer的第十三章练习题的13.48.是这样说的: 定义一个vector<String>并在其上多次调用push_back运行你的程序,并观察String被拷贝了多少次 ...
- STL vector中的begin方法(3)
原文地址:http://www.cplusplus.com/reference/vector/vector/begin/ public member function <vector> s ...
- C++ STL之vector详解
转自http://blog.sina.com.cn/s/blog_9f1c0931010180cy.html Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操 ...
最新文章
- 从源码角度入手实现RecyclerView的Item点击事件
- MATLAB作二维傅里叶变换所需要注意和知道的东西(im2double、fft2、abs、imshow、二维傅里叶变换的物理意义)
- AcWing算法提高课 Level-3 第四章 高级数据结构
- 用python做自动化测试仪器_使用python进行windows自动化测试(1)
- 【动态规划】牛客网:把数字翻译成字符串
- AI独角兽商汤科技的内部服务容器化历程
- Rust: (作者 洛佳) 使用Rust编写操作系统(附录一):链接器参数
- wpf分页预览html文件,用WPF实现打印及打印预览
- 一看就明白的超标量超流水线超线程简介
- 移动硬盘无法打开,提示需格式化
- 高级设计总监的设计方法论——5W1H需求分析法 KANO模型分析法
- GoodUP:智协云店通+BitCOO的4WiN全球互贸链 | 翼次元空间
- gentoo linux 分区_开始使用gentoo linux——gentoo安装笔记(上)
- psu 计算机 排名,PSU研究生计算机科学排名,真慎重来考察
- 嵌入式软件管培生每日总结-第3天
- 【刷题打卡】day7-BFS
- PostgreSQL,MongoDB,Neo4j,OrientDB和ArangoDB比较
- Origin2022安装教程
- 树莓派下使用USB摄像头
- 洛谷 P2327 [SCOI2005] 扫雷
热门文章
- 杭州好玩景点攻略884
- C++ SLT中的容器学习与函数谓词
- 假如现在你有30分钟,你会做什么?
- 大数据学习——spark笔记
- jvm调优转载自http://www.cnblogs.com/xingzc/p/5756119.html
- android 找不到手机,找不到 Android 开发者选项,难道我的手机系统没有?| 有轻功 #290...
- 信息安全实验:实现一个fake-wifi
- 脚本小子_Lua安装教程
- 轻量快速的国产导航软件Flare
- jqwidgets使用方法