Vector shrink 请求容器降低其容量和size匹配 shrink_to_fit();
一、先从size 和capacity 说起
resize(),设置大小(size);
reserve(),设置容量(capacity);
size()是分配容器的内存大小,而capacity()只是设置容器容量大小,但并没有真正分配内存。 打个比方:买了一个新房子,新房子里可以放3张床reserve(3),这是说房子的容量是最多放3张床,但是屋里并不是有三张床,二resize(3),房里安装了3张床,此时房里的床可以使用了。
reserve为容器预留足够的空间,避免不必要的重复分配,分配空间大于等于函数的参数,影响capacity。但reserve的功能确实蹩脚,只能用reserve是的capacity变得比之前大。
resize调整容器中有效数据区域的尺寸,如果尺寸变小,原来数据多余的截掉。若尺寸变大,不够的数据用该函数第二个参数填充,影响size。
由于vector是顺序容器,在内存中分配了一块连续的存储空间。为了保证动态添加元素的高效率,因此必须预先为vector分配一段空间,这个空间就是capacity。
而容器中元素的个数就是size(),在容器中,capacity总是大于等于 size;
当vector数组插入数据量过大时,其capacity,会变得很大,且清空vector容器后,还会保留原分配的容量capacity。系统不会自动收回空间吗?真的不会!!!!
我们一点一点写程序把risize()跟reserve()弄那个明白。
vector<int> t;for(int i=0;i<1000;i++){t.push_back(i);}cout<<t.size()<<' ';cout<<t.capacity()<<endl;t.resize(5);t.reserve(1);cout<<t.size()<<' ';cout<<t.capacity()<<endl;t.resize(20);t.reserve(2000);cout<<t.size()<<' ';cout<<t.capacity()<<endl;t.resize(10000);cout<<t.size()<<' ';cout<<t.capacity()<<endl;
运行结果
我们可以看出当Vector内只有五个元素时其分配空间还是1024,而reserve却不能做出任何反应,蹩脚,但是reserve能让容器空间变大,其实vector既然是容器他就会自动分配更多空间,所以reserve差评,这不是重点,重点是怎么将vector多分配出来的空间收回。有同学要说了clear()。
vector<int> t;for(int i=0;i<1000;i++){t.push_back(i);}cout<<t.size()<<' ';cout<<t.capacity()<<endl;t.clear();cout<<t.size()<<' ';cout<<t.capacity()<<endl;
运行结果
然而clear只是将容器内的元素清空了,对于分配的capacity,却没有作用。在这里有几种方法实现降低容量 ,但是其原理相同。
vector<int> t;for(int i=0;i<1000;i++){t.push_back(i);}cout<<t.size()<<' ';cout<<t.capacity()<<endl;t.clear();cout<<t.size()<<' ';cout<<t.capacity()<<endl;t.shrink_to_fit();cout<<t.size()<<' ';cout<<t.capacity()<<endl;
运行结果
当时我比较苦恼时大佬给我了两个方法,上面那个,还有一个底层的写法如下。
vector<int> t;for(int i=0;i<1000;i++){t.push_back(i);}cout<<t.size()<<' ';cout<<t.capacity()<<endl;t.clear();cout<<t.size()<<' ';cout<<t.capacity()<<endl;auto newt=t;swap(newt,t);cout<<t.size()<<' ';cout<<t.capacity()<<endl;cout<<newt.size()<<' ';cout<<newt.capacity()<<endl;
显然t容器已经被降低容量,但是其容量降低的代价时newt的容量变大。所以这种方法不可取。还有第三种方法。
vector<int> t;for(int i=0;i<1000;i++){t.push_back(i);}cout<<t.size()<<' ';cout<<t.capacity()<<endl;t.clear();cout<<t.size()<<' ';cout<<t.capacity()<<endl;vector<int>(t).swap(t);cout<<t.size()<<' ';cout<<t.capacity()<<endl;
以上就是对于vector的capacity的探究,当数据量较少时,多分配的capacity可以忽略,但是当数据量很大之后,就不能忽略了,所以当你clear之后记着shrink呀。
Vector shrink 请求容器降低其容量和size匹配 shrink_to_fit();相关推荐
- STL之vector,数组线性容器array,list容器,算法find,find_if,bind1st,仿函数
1.STL(Standard Template Library,是用泛型技术来设计完成的实例)的概念与组成 Iterator(迭代器) Container(容器) Algorithm(算法) A ...
- C++ Vector(向量容器)
Vector介绍 C++ Vector(向量容器) 是一个线性顺序结构.相当于数组,但其大小可以不预先指定,并且自动扩展.它可以像数组一样被操作,由于它的特性我们完全可以将vector 看作动态数组. ...
- 【转】C++ Vector(向量容器)
转自:https://blog.csdn.net/studentyyl/article/details/21177445 vector是一个线性顺序结构.相当于数组,但其大小可以不预先指定,并且自动扩 ...
- java 服务 容量评估,容器云平台容量规划及管理优化
随着容器云平台实践的深入,容器基础设施资源的分配和使用也暴露出了前期产品设计的一些意料之外的问题.特别在证券行业,资源的使用时段往往比较集中在上午9点到10点时段前后,过了这个时段,资源的使用量就迅速 ...
- c++ vector clear()清除容器中所有数据
#include <string.h> #include <vector> #include <iostream> using namespace std;int ...
- 11.考虑用排序的vector替代关联容器
当想到排序时,第一个想到的是关联容器set.muliset.map.multimap, 它们的底层实现为红黑树,查找的时间复杂度为O(log(n)).也可以使用哈希容器unordered_set.un ...
- vector和list容器有哪些区别
这个问题的本质还是在问顺序表和链表的区别 底层结构不同 vector容器 list容器 一段连续的空间 带头结点的双向循环链表 元素访问方式 vector容器 list容器 支持随机访问-O(1) 不 ...
- 张驰咨询:锂电池导入六西格玛咨询降低电池容量衰减
众所周知,电池的循环寿命是有限的.当一个电池进入了"老龄"阶段,科学家们会将其性能弱化的现象命名为"容量衰减"."容量衰减"现象表示的是随着 ...
- 客户端请求时间和服务端处理时间不匹配问题
现象: 客户端日志,调一个接口耗时为2-3s 服务端日志,处理一个请求耗时只有100-200ms 问题: 这明显速度不匹配, 理论上差不了太多才对 分析原因: 可能是服务端处理不过来,虽然一个请求服务 ...
最新文章
- 爬虫之requests模块在headers参数中携带cookie发送请求
- 如何改变本地git的根目录
- 详谈PHP垃圾回收机制
- 通过这些简单的步骤从头开始学习Java
- NVIDIA发布全新推理软件,开创交互式会话AI新时代!
- vue打卡日历_Vue日历
- 上周热点回顾(5.26-6.1)
- 打开Jupyter Notebook 时报错:EnvironmentLocationNotFound: Not a conda environment:
- 基于JAVA+SSH+MYSQL的社区医院远程挂号系统
- 自行编译cups绕过错误:file /etc/rc.d/rc.local from install of systemd conflicts with file from
- 标准差 php,PHP 计算Cpk以及标准差
- 三角形箭头向右的_css实现三角箭头
- JavaScript+css+html鼠标指针经过某些元素时背景变色
- 关于小程序上传图片到服务器
- 什么是端口?要如何修改端口?
- 【转】Google Earth究竟是怎样工作的
- LR-微信订车压力测试
- Linux下通过vmplayer安装CactiEZ
- 自学成才,PHP从入门到精通学习路线规划
- 锐取电视墙服务器型号,锐取REACH多媒体录播一体机多媒体录播一体机(高清系列)产品中心_DAV数字音视工程网...
热门文章
- Android开发之EditText编辑框光标位置
- 一个java源文件允许_一个Java源文件中最多只能有一个class定义
- linux 流量 脚本,linux 检测网络出入流量 当达到一定量时 自动执行另一个脚本。...
- python中反斜杠b_Python bytes 反斜杠转义问题解决方法
- ehcache 清除缓存_如何设计一个本地缓存
- Android学习笔记
- ActiveReports 报表应用教程 (10)---交互式报表之向下钻取(详细数据按需显示解决方案)...
- 陶哲轩实分析习题8.5.15
- 数据库迁移 编码问题
- php求及格,详解PHP通过递归实现提成计算