动态顺序表的C++版本

#define RECAPACITY 5

typedef int DataType;
class Vector
{
public:
	explicit Vector(size_t capacity = 3)
		:_pData(new DataType[capacity]),
		_capacity(capacity),
		_size(0)
	{
		size_t index=0;
		for(;index<capacity;index++)
		{
			_pData[index]=0;
		}
		cout<<"Vector()"<<endl;
	}

	// 有size个值为data的元素
	Vector(size_t n, const DataType& data)
		:_pData(new DataType[n]),
		_capacity(n),
		_size(n)
	{
		
		DataType* p=_pData;
		size_t index=0;
		for(;index<n;index++)
		{
			*p=data;
			p++;
		}
	}

	Vector(const Vector& v)
		: _capacity(v._capacity)
		, _size(v._size)
	{
		_pData = new DataType[_capacity];

		memcpy(_pData, v._pData, sizeof(DataType)*_capacity);

		
	}

	Vector& operator=(const Vector& v)
	{
		if(this!=&v)
		{
			DataType* ptmp=_pData;
			_capacity=v._capacity;
			_size=v._size;
			_pData=new DataType[_capacity];
			memcpy(_pData, v._pData, sizeof(DataType)*_capacity);
			delete[] ptmp;
		}
		return *this;
	}

	~Vector()
	{
		if(_pData)
		{
			delete[] _pData;
			_pData=NULL;
			_capacity=0;
			_size=0;
		}
		cout<<"~Vector():"<<this<<endl;
	}

///
	void PushBack(const DataType& data)
	{
		if(!_CheckCapacity())
		{
			_pData[_size]=data;
			_size++;
		}
		else
		{
			ReSize(_capacity+1,data);
			
		}

	}
	void PopBack()
	{
		if(_pData==NULL||_size==0)
			return ;
		
		_size--;
	}
	void Insert(size_t pos, const DataType& data)
	{
		if(pos<0||pos>_size)
			return ;

		if(!_CheckCapacity())
		{
			size_t tmp=_size;
			for(;tmp>pos;tmp--)
			{
				_pData[tmp]=_pData[tmp-1];
				
			}
			_pData[tmp]=data;
			_size++;
		}
		else
		{
			_size++;
			DataType* ptmp=_pData;
			_pData=new DataType[_capacity+RECAPACITY];
			_capacity=_capacity+RECAPACITY;
			size_t index=0;
			for(;index<_size;index++)
			{
				if(index<pos)
				{
					_pData[index]=ptmp[index];
				}
				else if(index==pos)
				{
					_pData[index]=data;
				}
				else
				{
					_pData[index]=ptmp[index-1];
				}
			}

			delete[] ptmp;
		}

	}
	void Erase(size_t pos)
	{
		if(pos<0||pos>=_size)
			return ;

		if(pos==_size-1)
		{
			_size--;
		}
		else
		{
			_size--;
			size_t index=pos;
			for(;index<_size;index++)
			{
				_pData[index]=_pData[index+1];
			}
		}
	}
	int Find(const DataType& data)const
	{
		size_t index=0;
		int count=0;
		for(;index<_size;index++)
		{
			if(_pData[index]==data)
			{
				count++;
			}
		}
		return count;
	}
	void Clear()
	{
		_size=0;
	}
	size_t Size()const
	{
		return _size;
	}
	void ReSize(size_t size, const DataType& data = DataType())
	{
		if(size<=_capacity)
		{
			_capacity=size;
			if(_size>size)
			{
				_size=size;
			}
		}
		else
		{
			DataType* ptmp=_pData;
			size_t index=0;
			_pData=new DataType[size];
			for(;index<_capacity;index++)
			{
				_pData[index]=ptmp[index];
			}

			for(;index<size;index++)
			{
				_pData[index]=data;
			}

			delete[] ptmp;

			_capacity=size;
			_size=size;
		}
	}
	size_t Capacity()const
	{
		return _capacity;
	}
	bool Empty()const
	{
		if(_size==0)
			return true;
		else
			return false;
	}
	DataType& Front()
	{
		assert(_size);

		return _pData[0];
	}
	const DataType& Front()const
	{
		assert(_size);

		return _pData[0];
	}
	DataType& Back()
	{
		assert(_size);

		return _pData[_size-1];
	}
	const DataType& Back()const
	{
		assert(_size);

		return _pData[_size-1];
	}
	void Assign(size_t n, const DataType& data = DataType())
	{
		_size=0;
		while(_capacity<n)
		{
			DataType* ptmp=_pData;
			_pData=new DataType[_capacity+RECAPACITY];
			_capacity=_capacity+RECAPACITY;
		}
		size_t index=0;
		for(;index<n;index++)
		{
			_pData[index]=data;
		}
		_size=n;
	}
	DataType& operator[](size_t index)
	{

		return _pData[index];
	}
	const DataType& operator[](size_t index)const
	{

		return _pData[index];
	}
	DataType& At(size_t index)
	{
		assert(index<=_size);

		return _pData[index];
	}
	const DataType& At(size_t index)const
	{
		assert(index<=_size);

		return _pData[index];
	}

	private:
	bool _CheckCapacity()
	{
		if(_size==_capacity)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	friend std::ostream& operator<<(std::ostream& _cout, const Vector& v);
private:
	DataType* _pData;
	size_t _capacity;
	size_t _size;
};

ostream& operator<<(std::ostream& _cout, const Vector& v)
{
	size_t index=0;
	for(;index<v._size;index++)
	{
		cout<<v._pData[index]<<" ";
	}
	return cout;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值