STL模拟实现vector

首先给出所需要实现的函数接口和类的封装

template<class T>
class Vector
{
public:
	Vector();//无参构造函数
	Vector(const T* array, size_t size);//有参数构造函数
	Vector(const Vector & v);//拷贝构造函数
	Vector& operator=(const Vector& s);//赋值运算符重载
	~Vector();//析构函数
	void PushBack(const T& data);//尾插
	void PopBack();//弹出尾部最后一个元素
	void Insert(size_t pos, const T& data);//指定位置的插入
	void Erase(size_t pos);//指定位置的删除
	size_t Size()const;//求元素个数
    size_t Capacity()const;//求空间容量
	bool Empty()const;//判空
	void Resize(size_t newSize, const T& data = T());//更改元素个数
	T& operator[](size_t index);
	const T& operator[](size_t index)const;
	friend ostream& operator<<(ostream &out, Vector<T>& s);
	T& Front();//返回第一个元素
	const T& Front()const;
	T& Back();
    const T& Back()const;//返回最后一个元素
	void Clear();
private:
	   void _CheckCapacity();//判满函数
private:
	T* _start;//指向起始位置
	T* _finish;//指向最后一个元素末尾
	T* _endOStorage;//指向开辟空间末尾0
};
接下来给出上面接口的具体的实现,但是其中有 类型萃取,因为需要根据不同的数据类型进行不同的赋值方式,从而提高程序的效率。

下面给出所有的实现代码和我自己的测试代码


struct TrueType
{
	static bool IsPODType()
	{
		return true;
	}
};
struct FalseType
{
	static bool IsPODType()
	{
		return false;
	}
};
template<class T>
struct TypeTraits
{
	typedef FalseType PODtype;
};
template<>
struct TypeTraits<double>
{
	typedef TrueType PODtype;
};
template<>
struct TypeTraits<int>
{
	typedef TrueType PODtype;
};
template<>
struct TypeTraits<char>
{
	typedef TrueType PODtype;
};
//上面是类型萃取部分的代码
template<class T>
class Vector
{
public:
	Vector();//无参构造函数
	Vector(const T* array, size_t size);//有参数构造函数
	Vector(const Vector & v);//拷贝构造函数
	Vector& operator=(const Vector& s);//赋值运算符重载
	~Vector();//析构函数
	void PushBack(const T& data);//尾插
	void PopBack();//弹出尾部最后一个元素
	void Insert(size_t pos, const T& data);//指定位置的插入
	void Erase(size_t pos);//指定位置的删除
	size_t Size()const;//求元素个数
    size_t Capacity()const;//求空间容量
	bool Empty()const;//判空
	void Resize(size_t newSize, const T& data = T());//更改元素个数
	T& operator[](size_t index);
	const T& operator[](size_t index)const;
	friend ostream& operator<<(ostream &out, Vector<T>& s);
	T& Front();//返回第一个元素
	const T& Front()const;
	T& Back();
    const T& Back()const;//返回最后一个元素
	void Clear();
private:
	   void _CheckCapacity();//判满函数
private:
	T* _start;//指向起始位置
	T* _finish;//指向最后一个元素末尾
	T* _endOStorage;//指向开辟空间末尾0
};
template<class T>
Vector<T>::Vector()
:_start(0)
, _finish(0)
, _endOStorage(0){}
template<class T>
Vector<T>::~Vector()
{
	if (_start)
	{
		delete[] _start;
		_start = _finish = _endOStorage = NULL;
	}
}
template<class T>
Vector<T>::Vector(const T* array, size_t size)
:_start(new T[size])
, _finish(_start+size)
, _endOStorage(_finish)
{
	if (TypeTraits<T>::PODtype::IsPODType())
	{
		memcpy(_start, array, sizeof(T)*size);
	}
	else
	{
		for (size_t i = 0; i < size; ++i)
			_start[i] = array[i];
	}
}
template<class T>
Vector<T>& Vector<T>::operator=(const Vector& s)
{
	if (s._start != _start)
	{
		_start = new T[s.Capacity()]//新开辟容量
			if (TypeTraits<T>::PODtype::IsPODType())
			{
				memcpy(_start, array, sizeof(T)*size);
			}
			else
			{
				for (size_t i = 0; i < size; ++i)
					*_start[i] = *s._start[i];
			}
			delete s._start;
	}
	return;
}
template<class T>
void Vector<T>::_CheckCapacity()
{
	if (_finish == _endOStorage)
	{
		size_t n = Size();
		T *start = new T[Capacity() + 5];//多开辟
		if (TypeTraits<T>::PODtype::IsPODType())
		{
			memcpy(start,_start, sizeof(T)*n);
		}
		else
		{
			for (size_t i = 0; i < n; ++i)
				start[i] = _start[i];
		}
		_finish = start + Size();
		_endOStorage = start+Capacity()+5;
		delete [] _start;
		_start = start;
	}
	return;
}
template<class T>
void Vector<T>::Insert(size_t pos, const T& data)//指定位置插入元素
{
	assert(pos <= Size()+1);
	_CheckCapacity();//判满
	size_t n = Size();
	for (size_t i =n; i >=pos; i--)
	{
		_start[i] = _start[i - 1];
	}
	_start[pos-1] = data;
	_finish++;
}
template<class T>
void Vector<T>::Erase(size_t pos)//指定位置的删除
{
	if (!Empty())
	{
		size_t n = Size();//获得元素个数
		for (size_t i = pos-1; i<n-1; i++)//删除位置后面的元素向后移动
		{
			_start[i] = _start[i+1];
		}
		_finish--;
	}
}
template<class T>
void Vector<T>::PushBack(const T& data)
{
	_CheckCapacity();
	*_finish++ = data;
}
template<class T>
void Vector<T>::PopBack()
{
	if (!Empty())
	{
		_finish--;
	}
	return;
}

template<class T>
void Vector<T>::Resize(size_t newSize, const T& data = T())//改变元素个数,新增加的空间所赋值的元素
{
	if (newSize<=Size())
	{
		_finish = _start + newSize;
	}
	else if (newSize > Size() && newSize < Capacity())
	{
		for (size_t i = Size(); i < newSize; i++)
		{
			_start[i] = data;//多出来的元素赋值为data
			_finish = _start + newSize;
		}
	}
	else
	{
		T *start = new T[newSize];
		for (size_t i=0; i < Size(); i++)
		{
			start[i] = _start[i];
		}
		for (size_t j = Size(); j < newSize; j++)
		{
			start[j] = data;
		}
		delete[] _start;
		_start = start;
		_finish = _start + newSize;
		_endOStorage = _start + newSize;
	}
}
template<class T>
bool Vector<T>::Empty()const
{
	if (_start == _finish)
		return true;
	else
	   return false;
}
template<class T>
size_t Vector<T>::Size() const//元素个数
{
	return _finish - _start;
}
template<class T>
size_t Vector<T>::Capacity()const
{
	return _endOStorage - _start;
}
template<class T>
T& Vector<T>::operator[](size_t index)
{
	return _start[index];
}
template<class T>
ostream&  operator<<(ostream &out, Vector<T>& s)
{
	out << s._start[i];
}
template<class T>
T& Vector<T>::Front()
{
	return *_start;
}
template<class T>
const T& Vector<T>::Front()const
{
	return *_start;
}
template<class T>
T& Vector<T>::Back()
{
	return *(_finish-1);
}
template<class T>
const T& Vector<T>::Back()const
{
	return *(_finish-1);
}
template<class T>
void Vector<T>::Clear()//清空元素
{
	_finish = _start;
}
void TestVector()
{
	int arr[] = { 1, 2, 3, 4, 5 };
	Vector<int> s(arr, sizeof(arr) / sizeof(*arr));
	cout <<"Back()="<< s.Back() << endl;
	cout << "Front()="<<s.Front() << endl;
	size_t n1 = s.Size();
	for (size_t i = 0; i < n1; i++)
	{
		cout << s[i] << " ";
	}cout << endl;
	s.Insert(6, 6);
	s.Insert(1, 0); 
		size_t n = s.Size();
	for (size_t i = 0; i < n; i++)
	{
		cout << s[i] << " ";
	}cout << endl;
	s.Erase(1);
	size_t n2 = s.Size();
	for (size_t i = 0; i < n2; i++)
	{
		cout << s[i] << " ";
	}cout << endl;
	
		s.Resize(10, 10);
	size_t n3 = s.Size();
	for (size_t i = 0; i < n3; i++)
	{
		cout << s[i] << " ";
	}cout << endl;

	s.Resize(5, 10);
	size_t n4 = s.Size();
	for (size_t i = 0; i < n4; i++)
	{
		cout << s[i] << " ";
	}cout << endl;
	cout << "Capacity=" << s.Capacity() << endl;

	string s1[] = { "aaa", "bbb","ccc","dddd"};
	string s3[4];
	Vector<string> s2(s1, sizeof(s1) / sizeof(*s1));
	size_t n5 = s2.Size();
	for (size_t i = 0; i < n5; i++)
	{
		cout << s2[i] << " ";
	}cout << endl;
}
测试结果如下,自己可以根据自己的想法去测试上面的功能



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值