向量类模板的实现

template <typename T>
class Vector
{
private:
	T* data;
	int size;
	int max;
public:
	enum { SPARE_MAX = 16 }; 
	explicit Vector(int n = 0) :size(0), max(n + SPARE_MAX)
	{
		data = new T[max];
	}

	Vector(const Vector& v)
	{
		data=v.data;
        size=v.size;
        max=v.size;
	}

	~Vector() { delete[] data; }

	Vector& operator=(const Vector& v);

	T& operator[](int id) { return data[id]; }
	const T& operator[](int id) const { return data[id]; }

	bool Empty() const { return size == 0; }//取空
	int Size() const { return size; }//求数据个数
	int Max() const { return max; }//求数据容量
	void Clear() { size = 0; }//清空所有元素

	typedef T* iterator;     //迭代器
	typedef const T* const_iterator;    //常量型迭代器
	iterator Begin() { return data; }
	const_iterator Begin() const { return data; }
	iterator End() { return data + size; }
	const_iterator End() const { return data + size; }

	T& Front() { return data[0]; }//返回首元素的引用
	const T& Front() const { return data[0]; }
	T& Back() { return data[size - 1]; }//返回尾元素的引用
	const T& Back() const { return data[size - 1]; }

	void Push_back(const T& item);//尾插
	void Pop_back()//尾删
	{
		if (!Empty()) size--;
	}

	void Reserve(int newMax);  //扩大数组容量为newMax,并保留原来的数据
	void Resize(int newSize, const T& item);   //把数据个数增加为newSize,保留原来的数据,其余的值为item

	iterator Insert(iterator itr, const T& item); //在itr所指向的位置插入item
	iterator Erase(iterator itr); //删除itr所指向的元素
};

//赋值运算符重载
template<typename T>
Vector<T>& Vector<T>::operator=(const Vector& v)
{
	delete[]data;
	data = new T[v.max];
	size = v.size;
	max = v.max;
	for (int i = 0; i < size; i++)
		data[i] = v.data[i];
	return *this;
}

//尾部插入数据
template<typename T>
void Vector<T>::Push_back(const T& item)
{
	data[size++] = item;
}

//扩大数组容量为newMax,并保留原来的数据
template<typename T>
void Vector<T>::Reserve(int newMax)
{
	if (newMax <= max)
	{
		return;
	}
	T* old = data;
	data = new T[newMax];
	for (int i = 0; i < size; i++)
	{
		data[i] = old[i];
	}
	max = newMax;
	delete[]old;
}

//把数据个数增加为newSize,保留原来的数据,其余的值为item
template<typename T>
void Vector<T>::Resize(int newSize, const T& item )
{
	if (newSize > max)
		Reserve(2 * newSize + 1);
	for (int i = size; i < newSize; i++)
		data[i] = item;
	size = newSize;
}

//基于指针插入数据
template<typename T>
typename Vector<T>::iterator Vector<T>::Insert(iterator itr, const T& item )
{
	if (size == max)
	{
		Reserve(size * 2 + 1);
	}
	for (iterator p = data + size, q = data + size - 1; p != itr; --p, --q)
	{
		*p = *q;
	}
	*itr = item;
	size++;
	return itr;
}

//基于指针删除数据
template<class T>
typename Vector<T>::iterator Vector<T>::Erase(iterator itr)
{
	//从删除位置开始的后一个元素依次前移一位,直到数组最后一个元素移动后,结束
	for (iterator p = itr, q = itr + 1; q != data + size; ++p, ++q)
	{
		*p = *q;
	}
	size--;
	return itr;
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明天早点睡吧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值