前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Vector shrink 请求容器降低其容量和size匹配 shrink_to_fit();

Vector shrink 请求容器降低其容量和size匹配 shrink_to_fit();

作者头像
风骨散人Chiam
发布2020-10-28 10:27:22
9080
发布2020-10-28 10:27:22
举报
文章被收录于专栏:CSDN旧文
一、先从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()弄那个明白。

代码语言:javascript
复制
	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()。

代码语言:javascript
复制
	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,却没有作用。在这里有几种方法实现降低容量 ,但是其原理相同。

代码语言:javascript
复制
	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;

运行结果

在这里插入图片描述
在这里插入图片描述

当时我比较苦恼时大佬给我了两个方法,上面那个,还有一个底层的写法如下。

代码语言:javascript
复制
	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的容量变大。所以这种方法不可取。还有第三种方法。

代码语言:javascript
复制
 	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呀。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/03/14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、先从size 和capacity 说起
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档