108次练习之模拟实现STL中的Vector
Posted 数据结构专题_By_高小调
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了108次练习之模拟实现STL中的Vector相关的知识,希望对你有一定的参考价值。
之前敲过很多遍的Vector就不算了,从现在开始,每次将敲过的次数记下来,直至108遍为止.(瑜伽做108遍拜日,在此借助瑜伽的思想)
为什么要敲这么多次?借助NLP中的一句话:最基础的就是最精华的!
为什么偏偏要敲108遍?借助瑜伽中108遍拜日的思想.
本文仅供个人学习,总结.....
废话不多说...开干!
/* *文件说明:模拟STL的Vector相关声明及实现(第1遍) *作者:高小调 *日期:2016-12-18 *集成开发环境:Microsoft Visual Studio 2010 */ #ifndef __VECTOR1_H__ #define __VECTOR1_H__ template<typename T> class Vector{ public: typedef T* Iterator; typedef const T * ConstIterator; public://默认成员函数 //构造函数 Vector() :_start(NULL) ,_finish(NULL) ,_endofstorgy(NULL){} //拷贝构造 Vector(const Vector & v) :_start(NULL) ,_finish(NULL) ,_endofstorgy(NULL){ if(v._arr != NULL){ //被拷贝对象不为空 size_t size = v.Size(); //有效元素个数 size_t capacity = v.Capacity(); //容量 _arr = new T[capacity]; //开辟内存 _Copy(_arr,v.Begin(),v.End()); //拷贝数据 _finish = _arr + size; //更新_finish _endofstorgy = _arr + capacity; //更新_endofstorgy } } //赋值运算符重载 Vector & operator=(const Vector &v){ if(_arr!=v._arr){ Vector tmp(v); _Swap(v); } } //析构函数 ~Vector(){ _Destory(); } public://公共接口函数 //尾插 void PushBack(const T & e){ Insert(End(),e); } //尾删 void PopBack(){ Erase(End()); } //插入单个元素 void Insert(Iterator pos,const T &e){ size_t sub = pos-_start; //记录当前位置与_finish的相对距离 _CheckCapacity(); //扩容检测及处理 pos = _start + sub; //更新pos,防止扩容后迭代器失效 Iterator It = _finish; while(pos<It){ *It = *(It-1); //移动数据 --It; } *pos = e; //插入数据 _finish++; //更新——_finish } //删除一个元素 void Erase(Iterator pos){ if(Empty()){ assert(false); //当前Vector为空 return ; } Iterator Cur = pos; Iterator end = End(); while(Cur<end){ *Cur = *(Cur+1); //循环覆盖Cur位置数据 Cur++; } --_finish; //更新_finish } //判断是否为空 bool Empty(){ return (_start==_finish); } //有效元素个数 size_t Size(){ return _finish-_start; } //容量 size_t Capacity(){ return _endofstorgy-_start; } //下标运算符重载 T &operator[](size_t index){ assert(index<Size()); return _start[index]; } const T &operator[](size_t index)const{ assert(index<Size()); return _start[index]; } public://迭代器相关操作 Iterator Begin(){ return _start; } ConstIterator Begin()const{ return _start; } Iterator End(){ return _finish; } ConstIterator End()const{ return _finish; } private: //检测扩容及处理 void _CheckCapacity(){ size_t OldSize = Size(); size_t OldCapacity = Capacity(); if(OldSize==OldCapacity){ size_t NewCapacity = OldCapacity*2+3; Iterator NewArr = new T[NewCapacity]; if(_start!=NULL){ _Copy(NewArr,Begin(),End()); delete[] _start; } _start = NewArr; _finish = _start + OldSize; _endofstorgy = _start + NewCapacity; } } //拷贝 void _Copy(Iterator dst,Iterator start,Iterator end){ while(start!=end){ *dst++ = *start++; } } //交换 void _Swap(const Vector &v){ swap(_start,v._start); swap(_finish,v._finish); swap(_endofstorgy,v._endofstorgy); } //销毁 void _Destory(){ if(_start!=NULL){ delete[] _start; _start = _finish = _endofstorgy = NULL; } } private: Iterator _start; //起始位置 Iterator _finish; //有效数据结束位置 Iterator _endofstorgy; //结束位置 }; #endif
/* *文件说明:测试Vector相关函数 *作者:高小调 *日期:2016-12-18 *集成开发环境:Microsoft Visual Studio 2010 */ #include<iostream> #include<assert.h> using namespace std; #include"Vector1.h" //测试函数 void VectorTest(){ Vector<int> v1; //测试PushBack、_CheckCapacity、Insert函数 v1.PushBack(1); v1.PushBack(2); v1.PushBack(4); v1.PushBack(5); v1.Insert(v1.Begin(),0); v1.Insert(v1.Begin()+3,3); //测试Begin、End、函数 Vector<int>::Iterator It1 = v1.Begin(); while(It1!=v1.End()){ cout<<*It1<<" "; ++It1; } cout<<endl; //测试Erase函数 v1.PopBack(); //尾删 5 v1.Erase(v1.Begin()); //头删 0 v1.Erase(v1.Begin()+2); //删除中间元素 3 //测试Size函数、[]重载 for(size_t i=0; i<v1.Size();++i){ cout<<v1[i]<<" "; } cout<<endl; } int main(){ VectorTest(); return 0; }
BUG总结:
据上次敲Vector过了11天,有些东西还是有些遗忘.
1.重载const与迭代器相关函数时,忘了给函数名后面加const
2.在插入函数中,防止迭代器失效,那个sub,莫名其妙的一开始想成了_finish-pos
3.想了半天Insert插入一段区间函数该怎么写,突然想到这个东西是List里的.
今天...就到这里了!
以上是关于108次练习之模拟实现STL中的Vector的主要内容,如果未能解决你的问题,请参考以下文章