stl剖析之vector

本文详细探讨了C++中的STL vector,它作为一个动态数组,适用于规模不确定的情况。重点分析了vector的insert函数,包括两个不同参数类型的insert操作,以及在不同情况下的空间管理策略,如检查空间是否足够、如何复制元素和调整内存等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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; }}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值