首先我们先来看Example Code:
#include <vector>
#include <iostream>
#include <memory>
using namespace std;
void main()
{
vector<int> v;
// cout<<v.allocator;
v.push_back(0);
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
v.push_back(5);
cout<<v.max_size();
}
利用VC6.0的内存调试
v.push_back(0);之后
//_First迭代器00481B40
//_Last迭代器00481B44
//_End迭代器004B1B44
v.push_back(1);之后
//_First迭代器00481B00
//_Last迭代器00481B08
//_End迭代器004B1B08
为什么在执行一次push_back之后,迭代器全部会变呢?
下面我们看看P.J. Plauger的代码
void insert(iterator _P, size_type _M, const _Ty& _X)
{if (_End - _Last < _M)
{size_type _N = size() + (_M < size() ? size() : _M);
iterator _S = allocator.allocate(_N, (void *)0);
iterator _Q = _Ucopy(_First, _P, _S);
_Ufill(_Q, _M, _X);
_Ucopy(_P, _Last, _Q + _M);
_Destroy(_First, _Last);
allocator.deallocate(_First, _End - _First);
_End = _S + _N;
_Last = _S + size() + _M;
_First = _S; }
else if (_Last - _P < _M)
{_Ucopy(_P, _Last, _P + _M);
_Ufill(_Last, _M - (_Last - _P), _X);
fill(_P, _Last, _X);
_Last += _M; }
else if (0 < _M)
{_Ucopy(_Last - _M, _Last, _Last);
copy_backward(_P, _Last - _M, _Last);
fill(_P, _P + _M, _X);
_Last += _M; }}
其中M = 1;
当_End - _Last < _M时,就要重新分配内存了,哦原来时这样的.
[个人认为,在方便调试的时候,可以把C:\MSDEV\VC98\Include\下面的vector文件中的protected改成public:]
下面我给出在5次插入之后其内存分配
push_back(2)
//00481AC0
//00481ACC
//00481AD0
push_back(3);
//00481AC0
//00481AD0
//00481AD0
push_back(4);
//00481B20
//00481B34
//00481B40
push_back(5);
//00481B20
//00481B38
//00481B40
注意没有,_Last - _First之后的明显是size() * 4
[注:在VC6.0的STL版本是采用的PJSTL版本,是一种公认最垃圾的STL版本
在C++ Builder中的STL版本是采用的RW版本,Rouge Wave公司
在unix下面GCC采用的是SGI Silicon Graphics Computer System Inc公司STL版本,我认为在可读性,可移植性方面最好的一个版本]