条款17:使用交换技巧来修正过剩容量
本节条款告诉我们,如果你有一个vector的容器,容器的容量是10000,但是,现在只用了1,那么为了节省内存,我们应该只保留使用的vector容量,多余的容量应该释放。
那么,怎么释放呢?
作者提供了一种方式,如下代码:
vector<int> a;
a.reserve(10000);
a.push_back(1);
vector<int>(a).swap(a);
以上代码做了什么?
很简单,a先是申请了10000的容量空间,接着使用了1个单位空间,最后,利用一个临时vector,根据拷贝构造函数,复制了a中的数据(此时临时对象的容量为1,因为vector的拷贝构造函数只分配拷贝的元素需要的内存)。通过swap方法让a还剩1个容量空间。
stirng也是一样
string s;
s.reserve(10000);
s.push_back('sss');
vector<int>(s).swap(s);
条款18:避免使用vector<bool>
本节主要就是说,bool的vector容器不是真正存储bool类型的对象,而是vector设计者用了位域的思想,直白的说就是一个bool对象由一个bit表示,而不是一个字节。
所以,vector<bool>
对象不能执行如下操作
:
vector<bool>v;
bool*pb=&v[0];//错误
如果深入探讨其中构造,则类型&v[0]
返回的是reference*
引用类型。