首页 > 代码库 > 使用“swap技巧”除去多余的容量

使用“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发生后,原先指向某容器中元素的迭代器、指针和引用仍然有效,并指向同样的元素,但是,这些元素已经在另一个容器中了。