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呀。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 答应我,用了这个jupyter插件,别再重复造轮子了
- 商业数据分析从入门到入职(9)Python网络数据获取
- 谈一谈还原解包后小程序页面wxss样式的若干方法
- 什么?不使用selenium爬京东评论?你是不是在骗我
- 骚操作,Python操作PPT,你会吗?
- 用了这个jupyter插件,我已经半个月没打开过excel了
- Mística:一款支持任意协议的应用程序通信工具
- 为什么阿里巴巴禁止使用BigDecimal的equals方法做等值比较?
- 原创 | codefroces中的病毒,这题有很深的trick,你能解开吗?
- 原创 | git的远程分支是干啥的,和本地的有什么区别?
- 京东技术主导:全新架构的分布式事务Hmily 2.1.1发布
- iOS音视频接入-TRTC接入前期key、秘钥等准备
- 你一定不知道的 Linux 使用技巧
- 当 Python 爬虫搭配起 Bilibili 唧唧,奇怪的生产力出现了
- 一个简单的小技巧,监控网页所有动态标签创建的调用处