使用“swap技巧”除去多余的容量



当我们需要从矢量中删除一些元素,通常是通过调用区间形式的erase。这很好的缩减了改矢量的大小,但并没有减小它的容量。如果你的矢量在某一个时刻拥有十万个候选人,那么它的容量将继续保持在(至少)100000,即使后来其中只有10个元素。为了避免矢量仍占用不再需要的内存,我们希望有一种方法能把它的容量从以前的最大值缩减到当前需要的数量。这种对容量的缩减通常被称为“shrink to fit”(压缩至适当大小)。方法如下:

vector<Contestant>(contestants).swap(contestants);

表达式vector<Contestant>(contestants)创建一个临时的矢量,它是contestants的拷贝:这是由vector的拷贝构造函数来完成的。然而,vector的拷贝构造函数只为所拷贝的元素分配所需要的内存,所以这个临时矢量没有多余的容量。然后我们把临时矢量中的数据和contestants中的数据做swap操作,在这之后,contestants具有了被去除之后的容量,即原先临时变量的容量,而临时变量的容量则变成了原先contestants臃肿的容量。在语句末尾,临时矢量被析构,从而释放了先前为contestants所占据的内存。同样的技巧,对string也适用。

注意:在做swap的时候,不仅两个容器的内容被交换,同时它们的迭代器、指针和引用页将被交换(string除外)。在swap发生后,原先指向某容器中元素的迭代器、指针和引用仍然有效,并指向同样的元素,但是,这些元素已经在另一个容器中了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值