关于STL容器,最令人称赞的特性之一就是是只要不超过它们的最大大小,它们就可以自动增长到足以容纳你放进去的数据。(要知道这个最大值,只要调用名叫max_size的成员函数。)对于vector和string,如果需要更多空间,就以类似realloc的思想来增长大小。vector容器支持随机访问,因此为了提高效率,它内部使用动态数组的方式实现的。在通过 reserve() 来申请特定大小的时候总是按指数边界来增大其内部缓冲区。当进行insert或push_back等增加元素的操作时,如果此时动态数组的内存不够用,就要动态的重新分配当前大小的1.5~2倍的新内存区,再把原数组的内容复制过去。所以,在一般情况下,其访问速度同一般数组,只有在重新分配发生时,其性能才会下降。正如上面的代码告诉你的那样。而进行pop_back操作时,capacity并不会因为vector容器里的元素减少而有所下降,还会维持操作之前的大小。对于vector容器来说,

如果有大量的数据需要进行push_back,

应当使用reserve()函数提前设定其容量大小,否则会出现许多次容量扩充操作,导致效率低下。

reserve成员函数允许你最小化必须进行的重新分配的次数,因而可以避免真分配的开销和迭代器/指针/引用失效。但

在我解释reserve为什么可以那么做之前,让我简要介绍有时候令人困惑的四个相关成员函数。在标准容器中,只有vector和string提供了所有这些函数。

2.使用“交换技巧”来修整vector过剩空间/内存

有一种方法来把它从曾经最大的容量减少到它现在需要的容量。这样减少容量的方法常常被称为“收缩到合适(shrink to fit)”。该方法只需一条语句:vector<int>(ivec).swap(ivec);
表达式vector<int>(ivec)建立一个临时vector,它是ivec的一份拷贝:vector的拷贝构造函数做了这个工作。但是,vector的拷贝构造函数只分配拷贝的元素需要的内存,所以这个临时vector没有多余的容量。

转载于:https://www.cnblogs.com/gaoxianzhi/p/3243486.html

容器 vector :为何要有reserve相关推荐

  1. C++线性序列容器vector简单总结

    C++线性序列容器<vector>简单总结 vector是一个长度可变的数组,使用的时候无须声明上限,随着元素的增加,Vector的长度会自动增加:Vector类提供额外的方法来增加.删除 ...

  2. c++ stl容器vector删除(erase),遍历等基本用法介绍及头文件

    Vectors 包含着一系列连续存储的元素,其行为和数组类似.访问Vector中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成,而查找特定值的元素所处的位置或是在Vector中插入元素则是线 ...

  3. std::vector中resize()和reserve()区别

    在STL容器中vector用的还是比较多的,但是在使用时,会对resize()和reserve()的使用产生迷惑,现在就对这一情况做个对比: resize():改变的是size()与capacity( ...

  4. C++ STL 容器 vector

    1 vector简介 顺序存储, 初始化过程会分配一定量空间, 在尾部插入会很快, 但是在中间插入元素, 会把之后所有元素向后平移, 所以较慢(中间删除元素同理). 如果元素个数超过当前限制, 会重新 ...

  5. 【C++ STL学习之二】容器vector大总结

    一.容器vector 使用vector必须包含头文件<vector>: #include<vector> 型别vector是一个定义于namespace std内的templa ...

  6. c++ 删除vector里面的第一个元素_C++提高第三篇2 STL常用容器 vector

    vector构造函数 void printVector(vector<int>& v){ for(vector<int>::iterator it = v.begin( ...

  7. c++容器vector介绍

    vector简介 vector是STL中最常见的容器,它是一种顺序容器,支持随机访问.vector是一块连续分配的内存,从数据安排的角度来讲,和数组极其相似,不同的地方就是:数组是静态分配空间,一旦分 ...

  8. 容器大小_C++复习篇(7)序列式容器vector

    点击蓝字 关注我们 主要内容 本篇内容主要介绍STL六大组件之一的序列式容器(vector),容器其实就是各种数据结构:另外,迭代器部分的内容可以看看<STL源码剖析>,它的的主要作用是作 ...

  9. oracle erase,c++ stl容器vector删除(erase),遍历等基本用法介绍及头文件

    Vectors 包含着一系列连续存储的元素,其行为和数组类似.访问Vector中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成,而查找特定值的元素所处的位置或是在Vector中插入元素则是线 ...

最新文章

  1. Java--语言基础
  2. ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车红外遥控实验
  3. 82%开源软件兼容Windows
  4. 数据结构 二叉树的建立,遍历
  5. 禅道项目管理——bug管理工具
  6. Java Set集合及Map集合详解
  7. 计算机信息检索自考知识点,计算机信息检索02139自考资料.doc
  8. css画横线箭头_用纯CSS实现的箭头
  9. 多个端口指定多个目录。花生壳多个域名多个网站
  10. Ueditor详细配置说明文档
  11. R语言结构方程模型(SEM)在生态学领域中的实践应用
  12. 如何成为Web开发人员—编写第一个Web应用程序
  13. c语言的字符串不是存放,在C语言中,字符串不存放在一个变量中,而是存放在一个中...
  14. 支付系统就该这么设计(万能通用),稳的一批!
  15. 第29课:AD中class,设计参数,规则的设置
  16. MySQL如何配置环境
  17. 如何把数据分析做“精准”?
  18. 本科计算机论文代码量,毕业设计的代码量
  19. 移动端京东添加触摸事件轮播图
  20. uin-app安卓打包流程

热门文章

  1. GitHub使用指南!(ubuntu)
  2. 2010 PDC Party @深圳 免费技术交流活动公告
  3. wondows下安装matplotlib(python包)
  4. 强行分类提取特征自编码网络例3
  5. 从源码分析DEARGUI之add_tree_node
  6. 银行程序代发工资的方法
  7. PHP China杨格:PHP China 是开发者的“家”
  8. jQuery与CSS3的选择器
  9. Outlook for Mac v15.36(170606)发布:新增收藏夹功能
  10. 终于等到你:CYQ.Data V5系列 (ORM数据层)最新版本开源了