简化版Vector实现

来源:互联网 发布:java replaceall \\\\ 编辑:程序博客网 时间:2024/06/10 17:17
/*功能:简化版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);//向向量的尾部插入元素//后置条件:向量的大小加1void pop_back();//删除向量尾部的元素//前提条件:向量非空,若向量为空,则产生一个underflowError异常T& back();//返回向量尾部的元素//前提条件:向量非空,如果向量为空,则产生一个underflowError异常const T& back() const;//常量版本,minVector为常量时使用int size() const;//返回当前向量的大小bool empty() const;//判断当前向量是否为空,若为空,返回true,否则返回falseint 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=falsereserve(size, false);reserve(size, false);//把size 赋值给vSizevSize = 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_backtemplate <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_backtemplate <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,否则返回falsetemplate <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和vArrvCapacity = n;vArr = newArr;}

原创粉丝点击