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

为了避免vector占用不再需要的内存,需要有一种方法把它的容量(capacity)缩减到当前需要的数量。方法就是:vector<ElemType>(v).swap(v);。

vector<ElemType>(v)创建一个临时变量,它是v的一个拷贝。vector的拷贝构造函数只为所拷贝的元素分配所需要的内存,所以这个临时变量不会有多余的容量。然后将这个临时变量与v做swap操作,在这之后v就具有了被去除之后的容量,即原先临时变量的容量。临时变量会具有原先v的容量,随后临时变量被析构,从而释放内存。

测试程序及输出(vc2008):

vector<int> v;
v.reserve(100);
cout << v.capacity() << endl;

for (int i = 0; i < 10; ++i)
         v.push_back(i);

vector<int>(v).swap(v);
cout << v.capacity() << endl;

vector<int>().swap(v);
cout << v.capacity() << endl;

output:
100
10
0

同样的技巧对string也适用:string(s).swap(s);。

需要注意:这一技术并不保证去除全部多余的容量。STL的实现者可能会为vector和string保存一定的多余的容量。所以这种“swap技巧”实际上意味着“在容器当前的大小确定的情况下,使容量在该实现下变为最小”。

对于swap操作,需要注意:不仅两个容器的内容会被交换,同时它们的迭代器、指针和引用也将被交换(string除外)。在swap之后,原先指向容器中元素的迭代器、指针和引用依然有效,并指向同样的元素——但这些元素已经在另一个容器中了。

 

你可能感兴趣的:(swap)