条目十七《使用“交换技巧”来修整过剩容量》
先说原理:
创建一个临时容器,把容器拷贝到临时容器,借用拷贝构造函数只对原容器有效元素拷贝而忽略多余的空间,然后再把临时容器和原容器的内容互相交换,就达到容量尽可能修剪的目的。
记住!!!是尽可能修剪。因为容器,比如vector在底层的实现可能是2的倍数这样分配内存的,所以会保持2的倍数的最小内存的容量。
看例子吧。
vector<int> vec;
vec.resize(1000);//这时强制把vec设置为容量是1000
for(int i = 0; i < 10; ++i)//经过循环vec只真正用了10个int内存,还剩990int内存
{
vec.push_back(i);
}
vector<int>(vec).swap(vec);//修剪vec的容量,使其释放多余的内存容量,尽可能保持最小容量
其实string也是一样的。这里就不展开了。
还有一种是通过以下方法来清空容器并使其变成容器提供的最小容量。
vector<int>().swap(vec);
原理也是上面的原理。。。