MyVector

#ifndef _ZB_ARRAY_
#define _ZB_ARRAY_


#pragma warning (disable : 4996)
#include <xmemory>
struct ArrayAlloc
{
	ArrayAlloc(){}
	~ArrayAlloc(){}
	void* Allocator(size_t len) { return new char[len]; }
	void Free(void *ptr, size_t len = 0) { delete[] ptr; }

	template<class Uty>
	void Destroy(Uty *Ptr)
	{	// destroy object at _Ptr
		Ptr->~Uty();
	}

	template<class Uty>
	void Destroy(Uty *first, Uty *last)
	{	// destroy object at _Ptr
		Uty* Ptr = first;
		while (Ptr)
		{
			Ptr->~Uty();
			++Ptr;
		}
	}

	template<class _Objty,
	class... _Types>
		void construct(_Objty *_Ptr, _Types&&... _Args)
	{	// construct _Objty(_Types...) at _Ptr
		::new ((void *)_Ptr) _Objty(_STD forward<_Types>(_Args)...);
	}
};

template<typename T, class Alloc = ArrayAlloc>
class TArray
{
	typedef T value_type;
	typedef T* printer;
	typedef T* iterator;
	typedef T& reference;
	typedef const T& const_reference;
	typedef size_t size_type;
	//typedef TArray<T, Alloc> Myt;
public:

	TArray() :Myfirst(0), Mylast(0), Myend(0) {}

	TArray(size_type Count)
	{
		fill_initialize(Count, value_type(0));
	}

	TArray(size_type Count, const_reference Val)
	{
		fill_initialize(Count, Val);
	}

	TArray(const TArray<T>& Right)
	{
		Myfirst = allocate_and_copy();
	}

	~TArray()
	{
		free_and_fill();
	}

	// 返回当前对象个数  
	size_type size() const { return (this->Mylast - this->Myfirst); }
	size_type capacity() const { return (this->Myend - this->Myfirst); }
	size_type max_size() const { return ((size_type)(-1) / sizeof(value_type)); }
	//查询
	bool empty() const { return (this->Myfirst == this->Mylast); }
	reference operator[](size_type off) const { return *(begin() + off); }
	// 提供访问函数  
	reference front(){ return (*begin()); }
	reference back() { return (*(end() - 1)); }
	// 获取几种迭代器  
	printer begin() const{ return Myfirst; }
	printer end() const{ return Mylast; }
	//插入
	void insert(iterator Where, size_t Count, value_type& data)
	{
		//Insert_n(Where, Count, data);
	}

	void insert(iterator Where, value_type& data)
	{
		Insert(Where, data);
	}

	void push_back(value_type data)
	{
		Insert(end(), data);
	}
	//删除
	iterator erase(iterator First, iterator End)
	{
		iterator Where = copy(End, Mylast, First);
		// 析构掉需要析构的元素  
		alloc.Destroy(Where, Mylast);
		Mylast = Mylast - (End - First);
		return Mylast;
	}

	iterator erase(iterator Where)
	{
		if (Where + 1 != end())
			std::copy(Where + 1, Mylast, Where);
		--Mylast;
		alloc.Destroy(Mylast);
		return Where;
	}

	void pop_back()
	{
		--Mylast;
		alloc.Destroy(Mylast);
	}

	void resize(size_type new_size) { Resize(new_size, value_type()); }

	void clear() { erase(begin(), end()); }
protected:
	// 这个提供STL标准的allocator接口  
	typedef std::allocator<value_type> allorator;
	//typedef simple_alloc <value_type, Alloc> data_allocator;
	// 释放分配的内存空间  
	void deallocate()
	{
		// 由于使用的是data_allocator进行内存空间的分配,  
		// 所以需要同样使用data_allocator::deallocate()进行释放  
		// 如果直接释放, 对于data_allocator内部使用内存池的版本  
		// 就会发生错误  
		if (Myfirst)
			alloc.Free(Myfirst, capacity());
	}

	// 分配空间, 并且复制对象到分配的空间处  
	iterator alloc_and_fill(size_type nCount, const_reference Val)
	{
		iterator res = (value_type*)alloc.Allocator(nCount * sizeof(value_type));
		std::uninitialized_fill_n(res, nCount, Val);
		return res;
	}

	//释放内存,并置空
	void free_and_fill()
	{
		//析构
		alloc.Destroy(Myfirst);
		// 释放内存  
		deallocate();
		Myfirst = 0;
		Mylast = 0;
		Myend = 0;
	}
	iterator Myfirst;
	iterator Mylast;
	iterator Myend;
private:
	void fill_initialize(size_type nCount, const_reference Val)
	{
		_TRY_BEGIN
		Myfirst = alloc_and_fill(nCount, Val);
		_CATCH_ALL
		free_and_fill();
		_RERAISE;
		_CATCH_END
		// 设置当前使用内存空间的结束点  
		Mylast = Myfirst + nCount;
		// 构造阶段, 此实作不多分配内存,  
		// 所以要设置内存空间结束点和, 已经使用的内存空间结束点相同  
		Myend = Mylast;
	}

	iterator Insert(iterator Where, value_type Val)
	{
		size_type Off = Where - begin();
		if (unused_capacity() > 0)// 剩下的备用空间大于等于“新增元素的个数”  
		{
			// 在备用空间起始处构造一个元素,并以vector最后一个元素值为其初值  
			alloc.construct(Mylast, *(Mylast - 1));
			++Mylast;
			std::copy_backward(Where, Mylast - 1, Mylast - 1);
			*Where = Val;
		}
		else// 已无备用空间  
		{
			const size_type old_size = size();
			const size_type len = 
				0 != old_size ? (old_size * 2) : 1;
			iterator new_first = (value_type*)alloc.Allocator(len * sizeof(value_type));
			iterator new_last = new_first;
			// 将内存重新配置 
			_TRY_BEGIN
			// 将原vector的安插点以前的内容拷贝到新vector  //memmove
			new_last = std::uninitialized_copy(Myfirst, Where, new_first);
			// 为新元素设定初值 x  
			alloc.construct(new_last, Val);
			// 调整水位  
			++new_last;
			// 将安插点以后的原内容也拷贝过来  
			new_last = uninitialized_copy(Where, Mylast, new_last);
			_CATCH_ALL
			// 回滚操作  
			alloc.Destroy(new_first, new_last);
			alloc.Free(new_first, len);
			_RERAISE;
			_CATCH_END
			// 析构并释放原vector  
			alloc.Destroy(new_first, new_last);
			free_and_fill();
			// 调整迭代器,指向新vector  
			Myfirst = new_first;
			Mylast = new_last;
			Myend = new_first + len;
			return (begin() + Off);
		}
		return end();
	}

	// 调整size, 但是并不会重新分配内存空间  
	void Resize(size_type new_size, const T& x)
	{
		if (new_size < size())
			erase(begin() + new_size, end());
		else
			insert(end(), new_size - size(), x);
	}

	size_type unused_capacity() { return (this->Myend - this->Mylast); }
private:
	Alloc alloc;
};

//创建日期:2016/2/3
#endif//_ZB_ARRAY_

STL 五个全局函数分别是: construct(),destroy(),uninitialized_copy(),uninitialized_fill(),uninitialized_fill_n()
http://blog.csdn.net/chenhanzhun/article/details/39253027
http://blog.csdn.net/hackbuteer1/article/details/7724547

以上参考

编译器:vs2013

加入预处理器(项目属性----C/C++----预处理----预处理器定义):

_SCL_SECURE_NO_WARNINGS


改进

1.在对内存操作进行改进

2.对迭代器进行归为一个类

3.对std::allocatorconstruct(),destroy(),uninitialized_copy(),uninitialized_fill(),uninitialized_fill_n()学习




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值