模拟实现Vector高级版

总结一下实现Vector时遇到的问题:

1.delete[]的时候总是报错,应当第一时间想到delete[]和new[]的匹配问题,可能由于自己太过自信,没有往那方面想,以至于浪费了好长时间调试代码

2.遇到错误应当现检查逻辑问题,然后再调试,不要浪费时间在寻找错误上,用调试技巧寻找错误会事半功倍。

3.关于数组下标问题,数组下标总是比数组大小少一个

学到的知识:

1.const &是专门引用右值,也可以用&&一般const&与&要成对重载

下面是代码实现:

#include<iostream>
#include<assert.h>
#include<initializer_list>
using namespace std;
typedef unsigned int size_t;
template<class T>
class Vector
{
public:
	typedef T ValueType;
	typedef ValueType* Iterator;
	typedef const ValueType* ConstIterator;
	typedef ValueType& Reference;
	typedef const ValueType& ConstReference;
	typedef size_t SizeType;
	Vector();
	Vector(size_t n,  T&& value = T());
	Vector(initializer_list<T> my);//用不同数字初始化Vector
	Vector(const Vector<T>& v);
	Vector<T>& operator=(const Vector<T>& v);
	virtual ~Vector()
	{
		delete[]this->_start;
	}
	Iterator Begin();
	ConstIterator Begin()const;
	Iterator End();
	ConstIterator End()const;
	SizeType Size()const;
	SizeType Capacity()const;
	bool Empty()const;
	Reference operator[](size_t index);
	ConstReference operator[](size_t index)const;
	Reference Front();
	ConstReference Front()const;
	Reference Back();
	ConstReference Back()const;
	//void PushBack(T&& value);也是引用右值常量,一般成对重载
	void PushBack(const T& value);//const表示引用右值常量;
	void PushBack(T& value);//引用左值变量
	void PopBack();
	Iterator Insert(Iterator pos, const T& value);
	Iterator Erase(Iterator pos);
	void ReSize(SizeType newSize, const T& value = T());
	void Clear()const;

private:
	void CheckCapacity();

protected:
	Iterator _start;
	Iterator _finish;
	Iterator _endOfStorage;
};
template<class T>
Vector<T>::Vector(initializer_list<T> my)
{
	
	this->_start = new T[my.size()];
	_endOfStorage = _start+my.size();
	_finish = _endOfStorage;
	int id = 0;
	for (Iterator i = (Iterator)my.begin(); i<(Iterator)my.end(); i++)//初始化
	{
		_start[id] = *i;
		id++;
	}
}
template<class T>
Vector<T>::Vector() :_start(0), _finish(0), _endOfStorage(0)
{
}
template<class T>
Vector<T>::Vector(size_t n,  T&& value = T()) : _start(new T[n])//new T[]而不是new T()
{
	for (size_t i = 0; i < n; i++)
	{
		_start[i] = value;
	}
	_finish = _start + n;
	_endOfStorage = _finish;
}
template<class T>
bool Vector<T>::Empty()const
{
	return Begin() == End();
}
template<class T>
Vector<T>::Vector(const Vector<T>& v)
{
	size_t len1 = this->_endOfStorage- this->_start;
	size_t len2 = v._finish - v._start;
	_start = new T[len2];
	for (size_t i = 0; i < len2; i++)
	{
		_start[i] = v._start[i];
	}
	_finish = _start + len2;
	_endOfStorage = _finish;
}
template<class T>
T& Vector<T>::operator[](size_t index)
{
	assert(index < size());
	return start[index];
	
}
template<class T>
const T& Vector<T>::operator[](size_t index)const 
{
	assert(index < size());
	return start[index];

}
template<class T>
size_t Vector<T>::Capacity()const
{
	return _endOfStorage - _start;
}
template<class T>
size_t Vector<T>::Size()const
{
	return _finish - _start;
}
template<class T>
T* Vector<T>::Begin()
{
	return _start;
}
template<class T>
T& Vector<T>::Front()
{
	return *Begin();
}
template<class T>
T& Vector<T>::Back()
{
	return *(End() - 1);
}
template<class T>
const T* Vector<T>::Begin()const 
{
	return _start;
}
template<class T>
T* Vector<T>::End()
{
	return _finish;
}
template<class T>
const T* Vector<T>::End()const
{
	return _finish;
}
template<class T>
Vector<T>& Vector<T>::operator=(const Vector<T>& v)
{
	size_t len1 = this->_endOfStorage - this->_start;
	size_t len2 = v._finish - v._start;
	if (len1<len2)
	{
		Iterator temp = new T[len2];
		delete _start;
		_start = temp;
	}
	for (size_t i = 0; i < len2; i++)
	{
		_start[i] = v._start[i];
	}
	_finish = _start + len2;
	_endOfStorage = _finish;
	return *this;
}
template<class T>
void Vector<T>::CheckCapacity()
{
	if (_finish >= _endOfStorage)
	{
		int newCapacity = Capacity() + 3;
		Iterator pTemp = new T[newCapacity];
		size_t size = _finish - _start;
		memcpy(pTemp, _start, sizeof(T)*size);
		if (NULL != _start)
		{
			delete[] _start;
		}
		_start = pTemp;
		_finish = _start + size;
		_endOfStorage = _start + newCapacity;
	}
}
template<class T>
void Vector<T>::PushBack(const T& value)//const引用常量,
{
	CheckCapacity();
	*_finish = value;
	_finish += 1;
}
template<class T>
void Vector<T>::PushBack(T& value)//引用左值变量
{
	CheckCapacity();
	*_finish = value;
	_finish += 1;
}
template<class T>
void Vector<T>::PopBack()
{
	assert(0 != Size());
	_finish -= 1;
}
template<class T>
T* Vector<T>::Insert(Iterator pos, const T& value)
{
	size_t nPos=pos-_start;
	CheckCapacity();
	
	if (nPos <= Size() && nPos >= 0)
	{
		for (size_t i=Size()-1; i >=nPos; i--)//下标从0开始所以Size()-1;,需要把nPos位置后移所以>=;
		{
			_start[i+1] = _start[i];
		}
		_start[nPos] = value;
		_finish += 1;
		return pos;
	}
	return NULL;
}
template<class T>
void Vector<T>::ReSize(SizeType newSize, const T& value = T())
{
	if (newSize < Size())
	{
		_endOfStorage = _start + newSize;
		_finish = _endOfStorage;
	}
	else
	{
		Iterator Temp = new T[newSize];
		delete []_start;
		_start = Temp;
		_finish = _start + newSize;
		_endOfStorage = _finish;
	}
	for (size_t i = 0; i < Capacity(); i++)
	{
		_start[i] = value;
	}
}
template<class T>
T* Vector<T>::Erase(Iterator pos)
{
	size_t nPos = pos - _start;
	if (nPos <= Size() && nPos >= 0)
	{
		for (size_t i = nPos; i<Size(); i++)
		{
			_start[i] = _start[i+1];
		}
		_finish -= 1;
		return pos;
	}
	return NULL;
}
template<class T>
void show(Vector<T> arr)
{
	Vector<int>::Iterator it;
	for (it = arr.Begin(); it != arr.End(); it++)
	{
		cout <<" "<<*it;
	}
	cout << endl;
}
void FunTest1()
{
	Vector<int>err{ 1, 2, 3, 4 };
	show(err);//1 2 3 4
}
void FunTest2()
{
	Vector<int>err(4,5);
	err.PushBack(10);
	show(err);//5 5 5 5 10
	err.PopBack();
	show(err);//5 5 5 5 
}
void FunTest3()
{
	Vector<int>arr{ 1, 2, 3, 4 };
	Vector<int>brr(arr);
	Vector<int>crr;
	Vector<int>drr;
	drr = crr = brr;
	drr.Erase(drr.Begin() + 2);
	show(drr);//1 2 4
	drr.Insert(drr.Begin() + 2, 3);
	show(drr);
}
void FunTest4()
{
	Vector<int>arr{ 1, 2, 3, 4 };
	show(arr);
	cout << arr.Back() << endl;
	cout << arr.Front() << endl;
	arr.ReSize(3, 10);
	int a = 2345;
	arr.PushBack(a);
	arr.PushBack(100);
	show(arr);//10 10 10 2345 100
}
int main()
{
	//FunTest1();
	//FunTest2();
	//FunTest3();
	FunTest4();
	system("pause");
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值