不可思议的缩小vetor

    如果vector的空间不够时,会自动的申请新的空间,空间大小为旧空间的2倍,然后将旧空间的数据拷贝到新空间,最后将旧空间释放。这种保留额外的内存空间已被将来增长的需要,从而防止增加新元素时过于频繁的重新分配。这也是vector比数组好的一点。

    当然有没有想过,(1)如果原有的旧空间为128,现在需要的空间为130,如果用vector存储则会自动的申请更大的空间,则新的空间大小为256,这就造成了空间的浪费,那么高效的c++程序会想办法优化这种情况。则怎样去缩小vector空间的大小。

   (2)如果开始存储的数据比较多例如为300个int型的空间,但是某些原因 需要删除很多数据,(这里需要知道vector删除数据,但是vector的空间大小不改变,也就是说剩下的一点数据占用的vector空间还是300个int的大小)这种情况又会造成空间的浪费,那么怎么去缩小vector的空间,让其空间与存储的数据相等或者大一点。

    以前自己也没有考虑过这种问题,这个思路是看《高效c++》这本书时想到的。

    vector<int> c(128);

    现在c.size()=128, 而且c.capacity()>=128;

    如果现在给vector尾部增加130个数,那么空间不够则重新申请新空间为2*128,但是存储的数据仅仅占用的空间只需要130或者大一点旧足够,于是可以通过如下方法去缩小vector的空间大小。

    c.erase(c.begin() + 130, c.end());   //删除130个元素之外的所有元素。

    vector<int>(c).swap(c);//创建一个临时的(未命名)的vector<int>,使之包含与c相同的内容,这里临时的vector与c的不同之处是:c有着过大的内部缓冲区并且有着大量额外空间,但是临时的vector所具有的容量却刚好容纳c所有的元素的复制对象。然后通过swap()将c的内部缓冲区与临时vector交换,就这样改变了c的容量的大小,交换后临时vector具有过大的内部缓冲区并且有着大量的额外空间,但是注意临时vector离开生存空间,那块大的缓冲区将会被系统内存收走。

   

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值