您的位置:首页 > 其它

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

2015-10-13 14:15 246 查看
一、为了避免vector占用不再需要的内存,需要有一种方法把它的容量(capacity)缩减到当前需要的数量。方法就是:

vector<ElemType>(v).swap(v);


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

参考:http://www.cnblogs.com/zhuyf87/archive/2012/12/06/2805318.html
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:
10


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

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

二、另外,swap技巧的一种变换形式可以用来清楚一个容器,使其容器变为该实现下的最小值,只要与一个用默认构造函数创建的vector或string做交换就可以了:

vector<T> v;
string s;
......
vector<T>().swap(v);//清除v并把它的容量变为最小
string().swap(s);//清除s并把它的容量变为最小


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

参考:Effective Stl
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: