C++ vector 容器浅析
在容器vector中,其内存占用的空间是只增不减的,比如说首先分配了10,000个字节,然后erase掉后面9,999个,则虽然有效元素只有一个,但是内存占用仍为10,000个。所有内存空间在vector析构时回收。
一般,我们都会通过vector中成员函数clear进行一些清除操作,但它清除的是所有的元素,使vector的大小减少至0,却不能减小vector占用的内存。要避免vector持有它不再需要的内存,这就需要一种方法来使得它从曾经的容量减少至它现在需要的容量,这样减少容量的方法被称为“收缩到合适(shrink to fit)”。(节选自《Effective STL》)如果做到“收缩到合适”呢,就要全仰仗“Swap大侠”啦,即通过如下代码进行释放过剩的容量:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> vec(100000, 0);
for (int i = 0; i < 100000-2; ++i) vec.pop_back();
cout << vec.capacity() <<endl;
vector<int>(vec).swap(vec);
cout << vec.capacity() << endl;
}
原理:
通过vector(vec)创建一个临时对象,调用复制拷贝函数,拷贝vec然后vector(vec).swap(vec); 交换临时对象与vec原来的vec为临时对象的大小,临时对象则为原来vec大小,临时对象失去作用域,析构释放原来vec的内存,实现内存回收。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)