c++ vector的扩容机制

这篇具有很好参考价值的文章主要介绍了c++ vector的扩容机制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、当向vector push_back一个元素时,如果此时元素个数超过了vector的容量,会触发扩容

2、扩容的过程是:开辟新空间->拷贝旧空间的元素->释放旧空间

3、扩容过程中开辟新空间的大小影响着往vector插入元素的效率:

  • 如果新空间大小为旧空间大小+1,也就是边插入边扩容,这样每一次插入都要进行拷贝,时间复杂度为O(n),效率非常低下
  • 如果新空间大小为旧空间大小+k,那么push_back一个元素的平均时间复杂度还是为O(n)。计算如下:

c++ vector的扩容机制

  •  如果新空间大小为旧空间大小的m倍,那么push_back一个元素的平均时间复杂度为O(1),效率得到大大提升。计算如下:

c++ vector的扩容机制

  •  一般m取1.5或2。取1.5的时候每次扩容时可以重用之前释放的内存,而取2的时候扩容时不能重用之前释放的内存,解释如下:

c++ vector的扩容机制

  • 为什么m不取3或4或者更大呢?因为如果倍数超过2倍(包含2倍)方式扩容会存在:①空间浪费可能会比较高,比如:扩容后申请了64个空间,但只存了33个元素,有接近一半的空间没有使用。②无法使用到前面已释放的内存。

4、总结

  • vector在push_back以成倍增长可以在均摊后达到O(1)的事件复杂度,相对于增长指定大小的O(n)时间复杂度更好。
  • 为了防止申请内存的浪费,现在使用较多的有2倍与1.5倍的增长方式,而1.5倍的增长方式可以更好的实现对内存的重复利用。

5、vector的size()、capacity()、resize()和reserve()

size返回vector中元素个数

capacity返回vector的容量(capacity>=size)

resize修改size大小,如果resize指定的大小n小于当前size,将多出来的元素删去;如果n大于size小于当前capacity,将会插入n-size个默认元素值;如果n大于capacity,会扩容使capacity=size=n

reserve修改capacity大小,如果指定大小n小于等于当前capacity,什么都不做;如果n大于capacity,将扩容到n

6、参考

面试题:C++vector的动态扩容,为何是1.5倍或者是2倍_vector扩容_森明帮大于黑虎帮的博客-CSDN博客

STL之vector扩容机制_萝卜说菜的博客-CSDN博客 文章来源地址https://www.toymoban.com/news/detail-496096.html

到了这里,关于c++ vector的扩容机制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。

    LeetCode第73题矩阵置零 1.思路: 想到一个开辟一点空间来解决方法,使用哈希集。就是使用一个哈希集(row和col)来储存数组中的元素为0的下标。然后再遍历,整个二维数组,在哈希集中存在对应的下标,就将这一行或这一列置为0。 2.代码部分

    2024年02月10日
    浏览(45)
  • C++ vector元素类型为什么不能是引用

    vectorT 引用必须要进行初始化,不能初始化为空对象,初始化后不能改变指向 引用是别名,不是对象,没有实际地址, 不能定义引用的指针 ,也 不能定义引用的引用 推荐一个零声学院项目课,个人觉得老师讲得不错,分享给大家: 零声白金学习卡(含基础架构/高性能存储

    2024年02月15日
    浏览(56)
  • C++中清空Vector内元素的方法以及释放内存

    初始化如下: 方法一: 使用 clear ,清空元素,但不回收空间 方法二: 使用 erase循环删除,结果同上 erase在每次操作时,迭代器指针会整体前移1,就是每次都会“搬”全部数据,所以vector不适合做频繁删除的容器。 方法三: 最简单的使用swap,清除元素并回收内存 这个做法

    2024年02月16日
    浏览(47)
  • 《C++ primer》练习3.20:输出vector相邻元素的和&输出vector头尾对象的和

    最近看《C++ Primer》,有这样一个题目 读入一组整数并把它们存入一个vector对象,将每对相邻整数的和输出出来。 这里要注意输入的奇数个和偶数个的数的区别。偶数个整数的话刚好数全部用完,奇数个整数最后一个数空出来,也输出出来,后面没有数了(再使用后面的索引

    2024年02月09日
    浏览(31)
  • 【Gabriel】C++中vector容器中元素输出(遍历)的5种方式

    大家好!我是Gabriel!我们在利用vector解算法题目时,经常需要遍历输出,对此,我有以下5种方法:  使用基于范围的for循环,从vector容器中逐个访问元素并输出它们:   使用迭代器遍历整个vector容器,并输出每个元素的值   使用标准库算法 std::for_each() 来遍历整个vector容器

    2024年02月07日
    浏览(72)
  • C++(20):vector通过erase,erase_if删除符合条件的元素

    C++20前,vector可以通过成员函数erase删除迭代器指定的元素,并返回被删除的下一个元素:  1.通过迭代器删除指定位置元素 需要说明的是,删除元素后,迭代器会失效,可以通过erase返回下一个有效的迭代器

    2024年01月16日
    浏览(40)
  • vector源码解析及扩容优化

    一、vector源码解析 没有任何一个东西可以在原地扩充,因为要了一块内存后,后面这块内存有可能被使用了,或者能不能用也不知道。链表可以保留原有节点,再将指针指向别处开辟的新内存,但这个也不算原地扩充。 对于vector这种需要连续空间存储数据的容器也是,因为

    2024年02月05日
    浏览(27)
  • C++ //练习 11.12 编写程序,读入string和int的序列,将每个string和int存入一个pair中,pair保存在一个vector中。

    练习 11.12 编写程序,读入string和int的序列,将每个string和int存入一个pair中,pair保存在一个vector中。 环境:Linux Ubuntu(云服务器) 工具:vim   代码块 运行结果显示如下

    2024年04月10日
    浏览(40)
  • css-4:元素水平垂直居中的方法有哪些?如果元素不定宽高呢?

    1、背景 在开发中,经常遇到这个问题,即让某个元素的内容在水平和垂直方向上都居中,内容不仅限于文字,可能是图片或其他元素。 居中是一个非常基础但又是非常重要的应用场景,实现居中的方法存在很多,可以将这些方法分成两个大类。 居中元素(子元素)的宽高已

    2024年02月14日
    浏览(36)
  • ArrayList 扩容机制

    ArrayList 实现了 List 接口。它可以存储包括 null 的任何类型的对象,允许重复元素。 ArrayList 在内部使用一个数组来存储元素,当元素数量超过数组容量时, ArrayList 会自动重新分配更大的内部数组,并且将现有元素复制到新数组中。 ArrayList 基本等同于 Vector ,但是 ArrayList 是

    2024年02月08日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包