STL(queue)

void main()
{
	deque<int> de;
	for(int i=1; i<512; ++i)
	{
		de.push_back(i);
	}
	de.push_back(512);
	de.push_back(513);
}
//queue.h
#ifndef _VECTOR_H
#define _VECTOR_H


#include"memory.h"


template<class _Ty,class _A = _my_allocator<_Ty> >
class vector
{
public:
	typename typedef _A::size_type       size_type;
	typename typedef _A::value_type      value_type;
	typename typedef _A::pointer         pointer;
	typename typedef _A::const_pointer   const_pointer;
	typename typedef _A::reference       reference;
	typename typedef _A::const_reference const_reference;
	typename typedef _A::pointer         iterator;
	typename typedef _A::const_pointer   const_iterator;
public:
	explicit vector(const _A& _A1 = _A()):allocator(_A1),_First(0),_Last(0),_End(0)
	{}
public:
	iterator begin()
	{return _First;}
	iterator end()
	{return _Last;}
public:
	void push_back(const _Ty& _X)
	{insert(end(),_X);}
	size_type size()const
	{return (_First == 0?0:_Last-_First);}
public:
	iterator insert(iterator _P,const _Ty& _X = _Ty())
	{
		size_type _O = _P - begin();
		insert(_P,1,_X);
		return _O+begin();
	}
	
	void insert(iterator _P,size_type _M,const _Ty& _X)
	{
		
		if(_End - _Last < _M)//容量不够
		{
			size_type _N = size() + (size()>_M?size():_M);//至少开辟为原来的2倍
			iterator _S = allocator.allocator(_N,(void*)0);//申请空间
			iterator _Q = _Ucopy(_First,_P,_S);//从_First到_P区间的拷入到_S的位置(初始数据)
			_Ufill(_Q,_M,_X);//将_M个_X填充到_Q位置
			_Ucopy(_P,_Last,_Q+_M);//从P到Last区间内数据拷入到Q+M的位置上
			_Destory(_First,_Last);//摧毁原有的空间,调用析构函数(释放该对象所指的空间)
			allocator.deallocator(_First,_End-_First);//delete该对象,释放空间
			_Last = _S+size()+_M;
			_End = _S+_N;
			_First = _S;//???????????????????????????????????
		}
		
		else if(_Last - _P < _M)//容量够,空间不足
		{
			_Ucopy(_P,_Last,_P+_M);
			_Ufill(_Last,_M-(_Last-_P),_X);//先将Last所指空间数据填充进去,(因为Last所指的是最后一个元素的下一个)
			fill(_P,_Last,_X);//再填充P到Last区域间的数据
			_Last += _M;
		}
		else if(0<_M)
		{
			///
			_Ucopy(_Last - _M, _Last, _Last);
			copy_backward(_P, _Last - _M, _Last);
			fill(_P, _Last, _X);
			_Last += _M;
		}
	}
protected:
	void _Destory(iterator _F,iterator _L)
	{
		for(;_F!=_L;++_F)
			allocator.destory(_F);
	}
	iterator _Ucopy(const_iterator _F,const_iterator _L,iterator _P)//未初始化拷贝,在P所指位置拷贝一个从F到L的区间
	{
		for(;_F!=_L;++_F,++_P)
			allocator.construct(_P,*_F);
		return _P;
	}
	void _Ufill(iterator _F,size_type _N,const _Ty& _X)//在F所指位置填充N个X
	{
		for(;_N>0;--_N,++_F)
			allocator.construct(_F,_X);
	}
	void _Xran()const//异常函数,抛出异常
	{
		_THROW(out_of_range,"invalid vector<T> subscript!");//发生越界
	}
private:
	_A allocator;
	iterator _First;
	iterator _Last;
	iterator _End;
};


#endif
双端队列和向量一样支持在常数时间内存取任意元素,模板类deque是除了vector之外唯一一个支持随机存取迭代器的容器。它有一个很重要的方面做得比vector好———可以在被控序列的开始处以常数时间来插入或删除元素,当然也可以在末端进行插入。双端队列可以像列表一样很好的用来实现先进先出队列或后进后出的栈,当频繁地在任意位置插入新元素时,它就没有列表那么好了,双队列所需的时间为线性的,而列表只需要常数时间,然而,如果需要对被控序列中的元素进行随机存取,那么双队列就更胜一筹了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值