vector部分实现
来源:互联网 发布:合欢花蜂蜜淘宝 编辑:程序博客网 时间:2024/06/10 08:07
#ifndef _MY_VECTOR_H
#define _MY_VECTOR_H#include <string.h>#include <assert.h>template<class T> class MyVector { public:class iterator { public:iterator():pelem(NULL){}iterator(T *pt):pelem(pt){}iterator(const iterator &iter); iterator& operator = (const iterator &iter); iterator& operator = (T *pt);~iterator(){}bool operator != (const iterator &iter);iterator& operator ++ ();iterator& operator ++ (int);iterator& operator -- ();iterator& operator -- (int);iterator operator + (size_t size); iterator operator - (size_t size); iterator& operator -= (size_t size); iterator& operator += (size_t size); T& operator * ();private:T *pelem;}; MyVector():pbuff(NULL),beg(NULL),last(NULL),count(0),capcity(0){}MyVector(const MyVector &orig); MyVector& operator = (const MyVector &orig); ~MyVector();T& operator [] (size_t index); void pushback(const T &mt);iterator insert(size_t index,const T &mt);iterator insert(const T *phead,const T *pback, iterator p);iterator erase(size_t index); iterator erase(iterator phead, iterator pback);void clear(); size_t size(); size_t capacity(); iterator begin();iterator end();private:void del_buff() { if(NULL != pbuff) { delete pbuff; pbuff = NULL;} } T *pbuff;iterator beg;iterator last;size_t count; size_t capcity; }; template<class T> size_t MyVector<T>::size() { return count; } template<class T> size_t MyVector<T>::capacity() { return capcity; } template<class T> MyVector<T>::MyVector(const MyVector<T> &orig) { count = orig.size();capcity = 2*count;pbuff =new T [count*2];size_t totalbytes = count*2*sizeof(T);memcpy(pbuff,orig.pbuff,totalbytes);} template<class T> MyVector<T>& MyVector<T>::operator = (const MyVector<T> &orig) { del_buff();count = orig.size();capcity = 2*count;pbuff =new T [count*2];size_t totalbytes = count*2*sizeof(T);memcpy(pbuff,orig.pbuff,totalbytes);return *this;} template<class T> MyVector<T>::~MyVector<T>(){ del_buff();} template<class T> T& MyVector<T>::operator[](size_t index) { return pbuff[index]; } template<class T> void MyVector<T>::pushback(const T &mt){ if(NULL == pbuff && 0 == count) { pbuff =new T[(1+count)*2];pbuff[0] = mt;count++;capcity = 2*count;} else{ if(NULL != pbuff && count == capcity) { capcity *= 2;T *ptem =new T[capcity];size_t totalbytes = capcity*sizeof(T);memcpy(ptem,pbuff,totalbytes);del_buff();pbuff = ptem;pbuff[count] = mt;count ++;} if(NULL != pbuff && count != capcity) { pbuff[count] = mt;count++;} } } template<class T> typename MyVector<T>::iterator MyVector<T>::insert(size_t index,const T &mt) { assert(count >= index);if(NULL != pbuff && count == capcity) { capcity *= 2;T *ptem =new T[capcity];memcpy(ptem,pbuff,capcity*sizeof(T));ptem[index] = mt;memcpy(&ptem[index+1],(count-index)*sizeof(T));del_buff();pbuff = ptem;count ++;typename MyVector<T>::iterator _iter(&pbuff[index]); return _iter; } elseif(NULL != pbuff && count != capcity){ size_t _end = count-1; size_t _beg = index; for(;_end >= _beg;_end--) pbuff[_end+1] = pbuff[_end];pbuff[index] = mt;count++;typename MyVector<T>::iterator _iter(&pbuff[index]); return _iter; } } template<class T> typename MyVector<T>::iterator MyVector<T>:: insert(const T *phead,const T *pback,typename MyVector<T>::iterator p) { typename MyVector<T>::iterator _beg = begin(),_end = end(); size_t insertnum = 0; for(;phead != pback;phead++) insertnum++;phead -= insertnum;size_t index = 0; for(;_beg != p;_beg++) index++;if(count +insertnum > capcity && NULL != pbuff) { capcity = 2*(count +insertnum);T *ptem =new T [capcity];memcpy(ptem,pbuff,(index)*sizeof(T));memcpy(&ptem[index],phead,insertnum*sizeof(T));memcpy(&ptem[index+insertnum],&pbuff[index],(count-index)*sizeof(T));del_buff();pbuff = ptem;count += insertnum;typename MyVector<T>::iterator _iter(&pbuff[index]); return _iter; } elseif(count +insertnum <= capcity && NULL != pbuff){ for(size_t i = insertnum;i != 0;i--,count--) pbuff[count+insertnum-1] = pbuff[count-1];for(;phead != pback;phead++,p++) *p = *phead;count += insertnum;return p; } if(NULL == pbuff && 0 == count) { capcity = 2*insertnum;pbuff =new T[capcity];memcpy(pbuff,phead,insertnum*sizeof(T));count = insertnum;typename MyVector<T>::iterator _iter(&pbuff[0]); return _iter; } } template<class T> typename MyVector<T>::iterator MyVector<T>::erase(size_t index){ T *temp =new T[count-index-1];memcpy(temp,&pbuff[index+1],(count-index-1)*sizeof(T));memcpy(&pbuff[index],temp,(count-index-1)*sizeof(T));pbuff[count-1] ='\0';count--;delete [] temp; typename MyVector<T>::iterator _iter(&pbuff[index]); return _iter; } template<class T> typename MyVector<T>::iterator MyVector<T>:: erase(typename MyVector<T>::iterator phead,typename MyVector<T>::iterator pback) { size_t elemnum = 0; size_t _toend = 0; for(;phead != pback;phead++) elemnum++;phead -= elemnum;for(;pback != end();pback++) _toend++;pback -= _toend;T *temp =new T[_toend];memcpy(temp,&pbuff[count-_toend],_toend*sizeof(T));memcpy(&pbuff[count-elemnum-_toend],temp,_toend*sizeof(T));memset(&pbuff[count-elemnum],'\0',(count-elemnum)*sizeof(T));delete [] temp; count -= elemnum;return phead; } template<class T> typename MyVector<T>::iterator MyVector<T>::begin() { beg = &pbuff[0];return beg; } template<class T> typename MyVector<T>::iterator MyVector<T>::end() { last = &pbuff[count];return last; } template<class T> MyVector<T>::iterator::iterator(consttypename MyVector<T>::iterator &iter){ pelem = iter.pelem;} template<class T> typename MyVector<T>::iterator& MyVector<T>::iterator:: operator = (consttypename MyVector<T>::iterator &iter){ pelem = iter.pelem;return *this;} template<class T> typename MyVector<T>::iterator& MyVector<T>::iterator:: operator = (T *pt){ pelem = pt;return *this;} template<class T> bool MyVector<T>::iterator::operator != (consttypename MyVector<T>::iterator &iter){ if(pelem != iter.pelem) returntrue;elsereturnfalse;} template<class T> typename MyVector<T>::iterator& MyVector<T>::iterator::operator ++ () { ++pelem;return *this;} template<class T> typename MyVector<T>::iterator& MyVector<T>::iterator::operator ++ (int){ pelem++;return *this;} template<class T> typename MyVector<T>::iterator& MyVector<T>::iterator::operator -- (int){ pelem--;return *this;} template<class T> typename MyVector<T>::iterator& MyVector<T>::iterator::operator -- () { --pelem;return *this;} template<class T> typename MyVector<T>::iterator& MyVector<T>::iterator::operator += (size_t size) { pelem += size;return *this;} template<class T> typename MyVector<T>::iterator& MyVector<T>::iterator::operator -= (size_t size) { pelem -= size;return *this;} template<class T> typename MyVector<T>::iterator MyVector<T>::iterator::operator + (size_t size) { pelem += size;typename MyVector<T>::iterator _iter(pelem); return _iter; } template<class T> typename MyVector<T>::iterator MyVector<T>::iterator::operator - (size_t size) { pelem -= size;typename MyVector<T>::iterator _iter(pelem); return _iter; } template<class T> T& MyVector<T>::iterator::operator * (){ return *pelem; }