关于vector空间的分配 c++STL源码:
if (_Count == 0)//这里进行了判断,但是什么都不做,不知道为什么??????? ; else if (max_size() - size() < _Count)//编译器可以申请的最大容量也装不下,抛出异常_THROW(length_error, "vector<T> too long"); _Xlen(); // result too long else if (_Capacity < size() + _Count)//当前空间不足,需要扩容 { // not enough room, reallocate _Capacity = max_size() - _Capacity / 2 < _Capacity ? 0 : _Capacity + _Capacity / 2; // try to grow by 50%,扩容50% if (_Capacity < size() + _Count)//扩容50%后依然不够容下,则使容量等于当前数据个数加上新增数据个数 _Capacity = size() + _Count; pointer _Newvec = this->_Alval.allocate(_Capacity);//申请新的空间 pointer _Ptr = _Newvec; _TRY_BEGIN _Ptr = _Umove(_Myfirst, _VEC_ITER_BASE(_Where), _Newvec); // copy prefix <span style="white-space:pre"> </span>//拷贝原有数据到新的内存中 _Ptr = _Ucopy(_First, _Last, _Ptr); // add new stuff<span style="white-space:pre"> </span>//拷贝新增数据到新的内存的后面 _Umove(_VEC_ITER_BASE(_Where), _Mylast, _Ptr); // copy suffix _CATCH_ALL _Destroy(_Newvec, _Ptr); this->_Alval.deallocate(_Newvec, _Capacity);//释放原来申请的内存不够时,每次扩容50%。 删除时,缓冲区大小并不会改变,仅仅只是清除了其中的数据。 只有在析构函数调用的时候vector才会自动释放缓冲区。
关于释放空间的方法: 方法1:shrink_to_fit(); 方法2:vector(myvector).swap(myvector); swap居然也可以,不相信的我试了一下
#include <iostream> #include <vector> using namespace std; int main() { vector<int> v1 = {1,2,3,4,5}; v1.reserve(100); cout << v1.size() << endl; cout << v1.capacity() << endl; vector<int>(v1).swap(v1); cout << v1.size() << endl; cout << v1.capacity() << endl; return 0; } 5 100 5 5居然真的可以。!!!! 然后查了一下为什么: swap()过程:先创建一个临时拷贝与原先的vector一致,此时的拷贝其容量是尽可能小的符合所需数据的。紧接着将该拷贝与原先的vector v进行 交换。执行交换后,临时变量会被销毁,内存得到释放。此时的v即为原先 的临时拷贝,而交换后的临时拷贝则为容量非常大的vector(不过已经被销毁)。