vectorSTL中的一种序列式容器,采用的数据结构为线性连续空间,它以两个迭代器 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)会增大到原来的 倍。​现在我们来均摊分析方法来计算 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的时间复杂度分析相关推荐

  1. C++STL的vector中front(),back(),begin(),end()的用法

    一.front( ),back( )的使用 arr.front();返回的是第一个元素的引用. arr.back();返回的的是最后一个元素的引用. 如果定义int c = a.back(),c并不是 ...

  2. vector中push_back()和emplace_back()的区别

    emplace_back() 和 push_back() 的区别,就在于底层实现的机制不同. push_back() 向容器尾部添加元素时,首先会创建这个元素,然后再将这个元素拷贝(调用拷贝构造函数) ...

  3. 递归算法中的时间复杂度分析

    对于一种算法的时间复杂度分析还是特别重要的,在一些非递归算法中,我们仅仅看运算次数最多的那一行代码可能执行多少次就可以,实际就是看在循环中变量的变化,但是对于递归算法中该怎么分析呢?下面介绍几种递归函 ...

  4. C++:vector中使用.clear()函数

    vector.clear()函数并不会把所有元素清零. vector有两个参数,一个是size,表示当前vector容器内存储的元素个数,一个是capacity,表示当前vector在内存中申请的这片 ...

  5. vector的push_back拷贝构造和空间占用分析

    本文同步自:http://zohead.com/archives/vector-push-back-space-copy/ 这两天在实际程序中使用 STL 的 vector push_back 类对象 ...

  6. C++ STL: 容器vector源码分析

    文章目录 前言 vector的核心接口 vector push_back实现 vector 的 Allocator vector 的 push_back 总结 前言 vector 是我们C++STL中 ...

  7. vector中的push_back(涉及到动态分配),resize,reserve,swap方法解析

    目录 一.vector的push_back解析 二.size和capacity 三.resize和reserve 1.resize 2.reserve 四.关于reserve的应用 五.内存释放 sw ...

  8. 关于c++中vector的push_back、拷贝构造copy constructor和移动构造move constructor

    问题来自C++ Primer的第十三章练习题的13.48.是这样说的: 定义一个vector<String>并在其上多次调用push_back运行你的程序,并观察String被拷贝了多少次 ...

  9. STL vector中的begin方法(3)

    原文地址:http://www.cplusplus.com/reference/vector/vector/begin/ public member function <vector> s ...

  10. C++ STL之vector详解

    转自http://blog.sina.com.cn/s/blog_9f1c0931010180cy.html Vectors    vector是C++标准模板库中的部分内容,它是一个多功能的,能够操 ...

最新文章

  1. 从源码角度入手实现RecyclerView的Item点击事件
  2. MATLAB作二维傅里叶变换所需要注意和知道的东西(im2double、fft2、abs、imshow、二维傅里叶变换的物理意义)
  3. AcWing算法提高课 Level-3 第四章 高级数据结构
  4. 用python做自动化测试仪器_使用python进行windows自动化测试(1)
  5. 【动态规划】牛客网:把数字翻译成字符串
  6. AI独角兽商汤科技的内部服务容器化历程
  7. Rust: (作者 洛佳) 使用Rust编写操作系统(附录一):链接器参数
  8. wpf分页预览html文件,用WPF实现打印及打印预览
  9. 一看就明白的超标量超流水线超线程简介
  10. 移动硬盘无法打开,提示需格式化
  11. 高级设计总监的设计方法论——5W1H需求分析法 KANO模型分析法
  12. GoodUP:智协云店通+BitCOO的4WiN全球互贸链 | 翼次元空间
  13. gentoo linux 分区_开始使用gentoo linux——gentoo安装笔记(上)
  14. psu 计算机 排名,PSU研究生计算机科学排名,真慎重来考察
  15. 嵌入式软件管培生每日总结-第3天
  16. 【刷题打卡】day7-BFS
  17. PostgreSQL,MongoDB,Neo4j,OrientDB和ArangoDB比较
  18. Origin2022安装教程
  19. 树莓派下使用USB摄像头
  20. 洛谷 P2327 [SCOI2005] 扫雷

热门文章

  1. 杭州好玩景点攻略884
  2. C++ SLT中的容器学习与函数谓词
  3. 假如现在你有30分钟,你会做什么?
  4. 大数据学习——spark笔记
  5. jvm调优转载自http://www.cnblogs.com/xingzc/p/5756119.html
  6. android 找不到手机,找不到 Android 开发者选项,难道我的手机系统没有?| 有轻功 #290...
  7. 信息安全实验:实现一个fake-wifi
  8. 脚本小子_Lua安装教程
  9. 轻量快速的国产导航软件Flare
  10. jqwidgets使用方法