欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

简化版Vector实现

程序员文章站 2022-03-23 14:02:01
...
/*
功能:简化版vector
说明:参照《Data Structures with C++ Using STL》第二版编写,
		没有编写异常处理模块,
		实现构造函数,复制构造函数,析构函数,赋值运算重载,下标运算重载,
		尾部添加元素push_back, 删除元素pop_back,取尾部元素back()
		获取向量大小size(),容量capacity(),判断向量是否为空empty()
*/
#include <iostream>
using namespace std;
template <typename T>
class minVector{
public:
	minVector(int size = 0);
	//构造函数
	//后置条件:使用元素数目和容量分配数组,所有元素被初始化为T()
	//T()是类型T的默认值
	minVector(const minVector<T>& obj);
	//复制构造函数
	//后置条件:以obj为副本生成当前向量
	~minVector();
	//析构函数
	//后置条件:动态数组被销毁
	minVector& operator =(const minVector<T>& rhs);
	//赋值运算符
	//后置条件:当前向量与rhs有相同的数据
	T& operator [](int i);
	//下标访问运算符重载
	//前提条件:0<= i < vSize, 超出范围产生一个indexRangerError异常
	const T& operator [](int i) const;
	//常量版本,minVector为常量时使用
	void push_back(const T& item);
	//向向量的尾部插入元素
	//后置条件:向量的大小加1
	void pop_back();
	//删除向量尾部的元素
	//前提条件:向量非空,若向量为空,则产生一个underflowError异常
	T& back();
	//返回向量尾部的元素
	//前提条件:向量非空,如果向量为空,则产生一个underflowError异常
	const T& back() const;
	//常量版本,minVector为常量时使用
	int size() const;
	//返回当前向量的大小
	bool empty() const;
	//判断当前向量是否为空,若为空,返回true,否则返回false
	int capacity() const;
	//返回当前容量

private:
	int vCapacity;	//可用空间的大小
	int vSize;		//表中元素个数
	T * vArr;		//动态数组
	void reserve(int n, bool copy);
	//仅当n>vCapacity时被公有函数调用,拓展向量的容量到n个元素,如果copy==true,现有元素被复制到新的空间,
	//删除旧的动态数组,如果分配内存失败,则产生一个memoryAllocationError异常

};

//构造函数,初始化vSzie和vCapacity, 分配动态数组,有vSize个整数
template <typename T>
minVector<T>::minVector(int size) :vSize(0), vCapacity(0), vArr(NULL)
{
	int i;
	//如果size为0,则vSize 和 vCapacity为0,vArr为NULL,只是返回
	if (size == 0)
		return;
	//设置容量为size,建立向量,没有要删除的动态数组,copy=false
	reserve(size, false);
	reserve(size, false);
	//把size 赋值给vSize
	vSize = size;
	//复制T()到每个向量元素
	for (i = 0; i < vSize; i++)
	{
		vArr[i] = T();
	}
}

//复制构造函数
template <typename T>
minVector<T>::minVector(const minVector<T>& obj)
{
	int i;
	reverse(obj.vSize, false);
	vSize = obj.vSize;
	vCapacity = obj.vCapacity;

	for (i = 0; i < vSize; i++)
		vArr[i] = obj.vArr[i];

	return *this;
}
//析构函数
template <typename T>
minVector<T>::~minVector()
{
	if (vArr != NULL)
	{
		delete[] vArr;
	}
}

//赋值运算符
template <typename T>
minVector<T>& minVector<T>::operator =(const minVector<T>& rhs)
{
	int i;
	//检查vCapacity是否需要分配新的数组
	if (vCapacity < rhs.vSize)
	{
		reverse(rhs.vSize, false);
	}
	vSize = rhs.vSize;
	//从rhs.vArr中复制数据项到vArr数组
	for (i = 0; i < vSize; i++)
		vArr[i] = rhs.vArr[i];

	return *this;
}

//重载下标运算符
template <typename T>
T& minVector<T>::operator[](int i)
{
	if (i < 0 || i >= vSize)
	{
		//处理异常
	}
	return vArr[i];
}

//push_back
template <typename T>
void minVector<T>::push_back(const T& item)
{
	//如果空间满了,则分配更多的容量
	if (vSize == vCapacity)
	{
		if (vCapacity == 0)
		{
			//如果容量为0,则设置容量为1,设置copy为false,不存在现有元素
			reserve(1, false);
		}
		else
		{
			//容量加倍
			reserve(2 * vCapacity, true);
		}

	}
	vArr[vSize] = item;
	vSize++;
}
//pop_back
template <typename T>
void minVector<T>::pop_back()
{
	if (vSize == 0)
	{
		//处理异常
	}

	vSize--;

}

//back取尾部的元素
template <typename T>
T& minVector<T>::back()
{
	if (vSize == 0)
	{
		//处理异常
	}
	return vArr[vSize - 1];
}
//返回当前向量的大小
template <typename T>
int minVector<T>::size() const
{
	return vSize;
}
//判断当前向量是否为空,若为空,返回true,否则返回false
template <typename T>
bool minVector<T>::empty() const
{
	if (vSize == 0)
		return true;
	
	return false;
}


//返回当前容量
template <typename T>
int minVector<T>::capacity() const
{
	return vCapacity;
}



//拓展容量
template <typename T>
void minVector<T>::reserve(int n, bool copy)
{
	T * newArr;
	int i;
	//分配新的n个元素的动态数组
	newArr = new T[n];
	if (newArr == NULL)
	{
		//异常处理

	}
	//若copy为true,则从旧表复制到新表
	if (copy)
	{
		for (i = 0; i < vSize; i++)
			newArr[i] = vArr[i];
	}
	//如果vArr为NULL,向量初始为空,则没有要删除的内存,否则,删除初始数组
	if (vArr != NULL)
	{
		delete[] vArr;
	}
	//更新vCapacity和vArr
	vCapacity = n;
	vArr = newArr;
}