如果vector的空间不够时,会自动的申请新的空间,空间大小为旧空间的2倍,然后将旧空间的数据拷贝到新空间,最后将旧空间释放。这种保留额外的内存空间已被将来增长的需要,从而防止增加新元素时过于频繁的重新分配。这也是vector比数组好的一点。
当然有没有想过,(1)如果原有的旧空间为128,现在需要的空间为130,如果用vector存储则会自动的申请更大的空间,则新的空间大小为256,这就造成了空间的浪费,那么高效的c++程序会想办法优化这种情况。则怎样去缩小vector空间的大小。
(2)如果开始存储的数据比较多例如为300个int型的空间,但是某些原因 需要删除很多数据,(这里需要知道vector删除数据,但是vector的空间大小不改变,也就是说剩下的一点数据占用的vector空间还是300个int的大小)这种情况又会造成空间的浪费,那么怎么去缩小vector的空间,让其空间与存储的数据相等或者大一点。
以前自己也没有考虑过这种问题,这个思路是看《高效c++》这本书时想到的。
vector<int> c(128);
现在c.size()=128, 而且c.capacity()>=128;
如果现在给vector尾部增加130个数,那么空间不够则重新申请新空间为2*128,但是存储的数据仅仅占用的空间只需要130或者大一点旧足够,于是可以通过如下方法去缩小vector的空间大小。
c.erase(c.begin() + 130, c.end()); //删除130个元素之外的所有元素。
vector<int>(c).swap(c);//创建一个临时的(未命名)的vector<int>,使之包含与c相同的内容,这里临时的vector与c的不同之处是:c有着过大的内部缓冲区并且有着大量额外空间,但是临时的vector所具有的容量却刚好容纳c所有的元素的复制对象。然后通过swap()将c的内部缓冲区与临时vector交换,就这样改变了c的容量的大小,交换后临时vector具有过大的内部缓冲区并且有着大量的额外空间,但是注意临时vector离开生存空间,那块大的缓冲区将会被系统内存收走。