前言
</br>
当我们的容器内存储了海量的元素之后,可能在某个阶段会进行大量的删除,此时容器已经没有必要再持有过多的内存,为了避免浪费,应该使用某种shrink_to_fit的手法将其cap缩减到合适的大小(resize与reserve都无法减小cap)。
Swap技巧
Swap与shrink_to_fit
收缩容器的技巧在操作上十分简单:1
2
3
4class Sth{...};
vector<Sth> v;
...//Now v need to be shrinked to the fit capacity
vector<Sth>(v).swap(v);
该技巧的执行流程:
- 建立了一个临时变量,并调用拷贝构造函数复制了v中元素
拷贝构造只使用了需要的内存,并没有分配所有内存 - 将临时对象与v交换。
- 完成此表达式后临时对象被析构。
同理,收缩string也是如此:1
2
3string s;
...
string(s).swap(s);
Swap与容器清除
Swap技巧同样也能够直接清除容器内部所有元素,并减小其容量至最小值,其原理是使用刚初始化过的临时变量与需要清除的vector或string交换,如下所示:1
2
3
4
5vector<Sth> v;
string s;
...
vector<Sth>().swap(v);
string().swap(s);