STL模拟实现vector

来源:互联网 发布:淘宝预定手办确认收货 编辑:程序博客网 时间:2024/04/29 03:01

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

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;}
测试结果如下,自己可以根据自己的想法去测试上面的功能



原创粉丝点击