zoukankan      html  css  js  c++  java
  • [c++面试准备]--vector对象是如何增长的

    参考资料:cpp primer 5th

    背景:

    为了支持快速的访问,vector/string将元素连续存储--每个元素都是紧挨着前一个元素存储。
    
    如果我们向vector/string中添加新的元素,会发生什么:由于连续存放的缘故,当没有多余的空间来容纳新的元素的时候,
    容器必须分配新的空间来保存已有的元素和新元素,将已有元素从旧位置移动到新空间中,然后添加新的元素,释放旧的空间。
    vector不会对新添加的每一个元素都做上述操作,效率太慢。
    所以vector会预留一些空间。就是因为这些预留的空间,容器的元素个数和实际容量不一定是相等的。

    具体应用:

    首先介绍两个概念:
    capacity,可以告诉我们容器在不扩张内存的情况下可以容纳多少各元素
    reserve,可以让我们通知容器它应该准备保存多少个元素的空间
    容器大小管理操作:
    shrink_to_fit只能用于vector,string,deque
    capacity,reserve只能用于vector,string
    c.shrink_to_fit(),将capacity()减少为size()相同的大小
    c.capacity() 不重新分配内存空间的话,c可以保存多少元素个数
    c.reserve(n) 分配至少能容纳n个元素的内存空间,n如果《=capacity(),那么reserve什么也不做;n大于当前容量时,才会分配空间。
    c.size() 容器中元素的个数,与capacity是不一样的;

    分配策略

    大部分vector采用的分配策略:就是在每次需要分配内存空间时,将当前的容量capacity翻倍;
    这也是不确定的,应该具体问题具体分析。

    分配原则

    通过在一个初始为空的vector上调用push_back来创建一个n个元素的vector,所花费的时间不能超过n的常熟倍

    例子

  • 相关阅读:
    Mybatis中selectKey源码分析
    Mybatis 基于注解Mapper源码分析
    MyBatis的二级缓存以及装饰器模式运用
    ConcurrentSkipListMap源码分析
    CopyOnWriteArrayList源码分析
    InnoDB 单列索引与多列索引
    Java 线程池源码分析
    JDK8 ReentrantReadWriteLock源码分析
    关于lombok的坑
    on duplicate key update 的用法说明(解决批量操作数据,有就更新,没有就新增)mybatis批量操作数据更新和添加
  • 原文地址:https://www.cnblogs.com/li-daphne/p/5399105.html
Copyright © 2011-2022 走看看