容器 vector :为何要有reserve
关于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相关推荐
- C++线性序列容器vector简单总结
C++线性序列容器<vector>简单总结 vector是一个长度可变的数组,使用的时候无须声明上限,随着元素的增加,Vector的长度会自动增加:Vector类提供额外的方法来增加.删除 ...
- c++ stl容器vector删除(erase),遍历等基本用法介绍及头文件
Vectors 包含着一系列连续存储的元素,其行为和数组类似.访问Vector中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成,而查找特定值的元素所处的位置或是在Vector中插入元素则是线 ...
- std::vector中resize()和reserve()区别
在STL容器中vector用的还是比较多的,但是在使用时,会对resize()和reserve()的使用产生迷惑,现在就对这一情况做个对比: resize():改变的是size()与capacity( ...
- C++ STL 容器 vector
1 vector简介 顺序存储, 初始化过程会分配一定量空间, 在尾部插入会很快, 但是在中间插入元素, 会把之后所有元素向后平移, 所以较慢(中间删除元素同理). 如果元素个数超过当前限制, 会重新 ...
- 【C++ STL学习之二】容器vector大总结
一.容器vector 使用vector必须包含头文件<vector>: #include<vector> 型别vector是一个定义于namespace std内的templa ...
- c++ 删除vector里面的第一个元素_C++提高第三篇2 STL常用容器 vector
vector构造函数 void printVector(vector<int>& v){ for(vector<int>::iterator it = v.begin( ...
- c++容器vector介绍
vector简介 vector是STL中最常见的容器,它是一种顺序容器,支持随机访问.vector是一块连续分配的内存,从数据安排的角度来讲,和数组极其相似,不同的地方就是:数组是静态分配空间,一旦分 ...
- 容器大小_C++复习篇(7)序列式容器vector
点击蓝字 关注我们 主要内容 本篇内容主要介绍STL六大组件之一的序列式容器(vector),容器其实就是各种数据结构:另外,迭代器部分的内容可以看看<STL源码剖析>,它的的主要作用是作 ...
- oracle erase,c++ stl容器vector删除(erase),遍历等基本用法介绍及头文件
Vectors 包含着一系列连续存储的元素,其行为和数组类似.访问Vector中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成,而查找特定值的元素所处的位置或是在Vector中插入元素则是线 ...
最新文章
- Java--语言基础
- ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车红外遥控实验
- 82%开源软件兼容Windows
- 数据结构 二叉树的建立,遍历
- 禅道项目管理——bug管理工具
- Java Set集合及Map集合详解
- 计算机信息检索自考知识点,计算机信息检索02139自考资料.doc
- css画横线箭头_用纯CSS实现的箭头
- 多个端口指定多个目录。花生壳多个域名多个网站
- Ueditor详细配置说明文档
- R语言结构方程模型(SEM)在生态学领域中的实践应用
- 如何成为Web开发人员—编写第一个Web应用程序
- c语言的字符串不是存放,在C语言中,字符串不存放在一个变量中,而是存放在一个中...
- 支付系统就该这么设计(万能通用),稳的一批!
- 第29课:AD中class,设计参数,规则的设置
- MySQL如何配置环境
- 如何把数据分析做“精准”?
- 本科计算机论文代码量,毕业设计的代码量
- 移动端京东添加触摸事件轮播图
- uin-app安卓打包流程
热门文章
- GitHub使用指南!(ubuntu)
- 2010 PDC Party @深圳 免费技术交流活动公告
- wondows下安装matplotlib(python包)
- 强行分类提取特征自编码网络例3
- 从源码分析DEARGUI之add_tree_node
- 银行程序代发工资的方法
- PHP China杨格:PHP China 是开发者的“家”
- jQuery与CSS3的选择器
- Outlook for Mac v15.36(170606)发布:新增收藏夹功能
- 终于等到你:CYQ.Data V5系列 (ORM数据层)最新版本开源了