17.swap去除多余容量

前言

</br>
当我们的容器内存储了海量的元素之后,可能在某个阶段会进行大量的删除,此时容器已经没有必要再持有过多的内存,为了避免浪费,应该使用某种shrink_to_fit的手法将其cap缩减到合适的大小(resize与reserve都无法减小cap)。

Swap技巧

Swap与shrink_to_fit

收缩容器的技巧在操作上十分简单:

1
2
3
4
class Sth{...};
vector<Sth> v;
...//Now v need to be shrinked to the fit capacity
vector<Sth>(v).swap(v);

该技巧的执行流程:

  1. 建立了一个临时变量,并调用拷贝构造函数复制了v中元素
    拷贝构造只使用了需要的内存,并没有分配所有内存
  2. 将临时对象与v交换。
  3. 完成此表达式后临时对象被析构。

同理,收缩string也是如此:

1
2
3
string s;
...
string(s).swap(s);

Swap与容器清除

Swap技巧同样也能够直接清除容器内部所有元素,并减小其容量至最小值,其原理是使用刚初始化过的临时变量与需要清除的vector或string交换,如下所示:

1
2
3
4
5
vector<Sth> v;
string s;
...
vector<Sth>().swap(v);
string().swap(s);