vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的.vector的实质就是,
1.开辟一个更大的空间.
2.将原数据复制过去
3.释放原空间
*****************************************************************************************************************
如果你对vector足够了解,其实它主要的难点就在于insert函数。
那么小编就来带大家认识了解 相信定会让你有新的认识体会!
*****************************************************************************************************************
1.首先为什么有两个insert函数???因为它们插入的类型参数不一样,一个是M个 _Ty类型,一个是It类型的空间。
2.第一个if它是做什么的?
首先它需要判断空间是否足够容纳插入的数,size()代表原有的数量大小,_M是需要插入的个数,_S是新开辟的一个空间,
每次拓宽原有空间两倍。然后将first所指到_P插入节点的空间复制到_S中,然后将_M个X放入,随后将剩下的插入节点_p到_last
放入到空间中,然后将原始的空间删除
3.第二个else if:它是判断 元素数量是否足够!因为它到了第二种可能性了 肯定 是不满足第一个的,因此空间肯定够!
4.第三个else if:前两个条件满足的话 直接插入就可以了
/****************************************************************************************************************
这是两个函数的原型,对照着传入参数!
iterator _Ucopy(const_iterator _F, const_iterator _L,
iterator _P)
{for (; _F != _L; ++_P, ++_F)
allocator.construct(_P, *_F);
return (_P); }//当头不等于插入点时,插入点_p一直加。返回插入_P 。FIRET指针
void _Ufill(iterator _F, size_type _N, const _Ty &_X)
{for (; 0 < _N; --_N, ++_F)
allocator.construct(_F, _X); }//开辟好空间后指定插入头位置 直接往进插入
/*****************************************************************************************************************/
它的核心思想就是将空间往后挪,然后将原始的空间数值拷贝到以新的_P位置为头的空间。然后将first到_p这段空间插入要插入的值
//***************************************************************************************************************/

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);//这里是开辟了2倍空间
iterator _Q = _Ucopy(_First, _P, _S); //这里是_s空间中创建M个值得空间
_Ufill(_Q, _M, _X); //将值插入
_Ucopy(_P, _Last, _Q + _M); //将剩余的_p到last放入到空间中,此时的_Q+_M位置相当于新的last
_Destroy(_First, _Last); //将原始的空间删除
allocator.deallocate(_First, _End - _First); //
_End = _S + _N; //__S此时相当于FIRST
_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; }}
void insert(iterator _P, _It _F, _It _L)
{size_type _M = 0;
_Distance(_F, _L, _M);
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);
_Q = _Ucopy(_F, _L, _Q);
_Ucopy(_P, _Last, _Q);
_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);
_Ucopy(_F + (_Last - _P), _L, _Last);
copy(_F, _F + (_Last - _P), _P);
_Last += _M; }
else if (0 < _M)
{_Ucopy(_Last - _M, _Last, _Last);
copy_backward(_P, _Last - _M, _Last);
copy(_F, _L, _P);
_Last += _M; }}