vector C++实现

来源:互联网 发布:知我是个无法讨好的人 编辑:程序博客网 时间:2024/05/29 03:00

闲来蛋疼,练练手。

参考标准库的vector实现。与STL源码相比大同小异,主要功能都以实现。

#include<iostream>#include<algorithm>#include<memory>using namespace std;template<class T>class Vector{public:typedef T value_Type;typedef value_Type* Pointer;typedef value_Type* iterator;typedef value_Type& reference;typedef size_t size_type;typedef ptrdiff_t difference_type;protected:iterator start;iterator finish;iterator end_of_storage;void insert_aux(iterator position,const T& x);void fill_initialize(size_type n, const T& value){start = allocate_and_fill(n,value);finish = start + n;end_of_storage = finish;}iterator allocate_and_fill(const size_type n, const T& value){iterator result = new value_Type[n];uninitialized_fill_n(result,n,value);return result;}iterator uninitialized_fill_n(iterator first,size_t n ,const T& x){iterator tmp_start = first;while(n--){*first++ = x;}return tmp_start;}public:iterator begin(){return start;}iterator end(){return finish;}size_type size(){return size_type(end()-begin());}bool empty()const{return begin() == end();}reference operator[](size_type n){return *(begin()+n);}Vector():start(0),finish(0),end_of_storage(0){}Vector(size_type n, const T& value){fill_initialize(n,value);}Vector(int n, const T& value){fill_initialize(n,value);}Vector(long n, const T& value){fill_initialize(n,value);}explicit Vector(size_type n){fill_initialize(n,T());}~Vector(){destory(start,finish);deallocate(start);}void deallocate(iterator iter){delete []iter;}void destory(iterator iter){iter->~T();}void destory(iterator start, iterator finish){int i=0;while ((start+i) != finish){(start+i)->~T();i++;}}reference front(){return *begin();}reference back(){return *(end()-1);}void push_back(const T& x){if(finish!=end_of_storage)*finish = x;else{insert(end(),1,x);}++finish;}void pop_back(){--finish;destory(finish);}iterator erase(iterator position){if(position+1 != end())copy(position+1,finish,position);--finish;destory(finish);return position;}iterator erase(iterator first,iterator last){iterator tmp = copy(last,finish,first);destory(tmp,finish);finish = finish - (last-first);return first;}void resize(size_type new_size,const T& x){if(new_size< size())erase(begin()+new_size,end());else insert(end(),new_size-size(),x);}void resize(size_type new_size){resize(new_szie,T());}void clear(){erase(begin(),end());}void insert(iterator position,size_type n,const T& x){if(n!=0){//备用空间大于新增元素个数if(size_type(end_of_storage-finish)>=n){T x_copy;const size_type elems_after = finish -position;iterator old_finish = finish;if(elems_after > n){uninitialized_copy(finish-n,finish,finish);finish += n;copy_backward(position,old_finish-n,old_finish);fill(position,position+n,x_copy);}else{uninitialized_fill_n(finish,n-elems_after,x_copy);finish += n - elems_after;uninitialized_copy(position,old_finish,finish);finish += elems_after;fill(position,old_finish,x_copy);}}else{ //备用空间不足const size_type old_size = size();const size_type len = old_size + max(old_size,n);iterator new_start = reallocate(old_size+2*(max(old_size,n)));//新增元素个数为不足空间个数的2倍iterator new_finish = new_start;try{// 将vector插入点之前的元素复制到新空间new_finish = uninitialized_copy(start,position,new_start);new_finish = uninitialized_fill_n_my(new_finish,n,x);new_finish = uninitialized_copy(position,finish,new_finish);}//#ifdef _STL_USE_EXCEPTIONScatch(...){//若发生异常,回滚保持原有向量destory(new_start,new_finish);deallocate(new_start);throw;}//#endifdestory(start,finish);deallocate(start);start = new_start;finish = new_finish;end_of_storage = new_start + len;}}}iterator uninitialized_copy(iterator first,iterator last,iterator res){while(first!=last){*(res++) = *(first++); }return res;}iterator copy_backward(iterator first,iterator last,iterator res){while(last!=first){*(--res) = *(--last);}return res;}iterator reallocate(const size_t len){iterator iter;iter = new T[len];return iter;}iterator uninitialized_fill_n_my(iterator start,size_t n, const T& x){while(n--){*(start++) = x;}return start;}iterator find(iterator first,iterator last,const T& value){while(first!=last){if(*first == value)return first;++first;}return first;}};void test1(){//测试各种类型数据存储Vector<int> Vint(10,2);for(Vector<int>::iterator iter =Vint.begin();iter!= Vint.end();++iter)cout<<*iter<<" ";cout<<endl;Vector<float>Vflt(10,2.1);for(Vector<float>::iterator iter =Vflt.begin();iter!= Vflt.end();++iter)cout<<*iter<<" ";cout<<endl;Vector<double>Vdoub(10,2.13);for(Vector<double>::iterator iter =Vdoub.begin();iter!= Vdoub.end();++iter)cout<<*iter<<" ";cout<<endl;class TT{int tmp;public:TT(int a=0):tmp(a){}operator int(){return tmp;}};Vector<TT>Vtt(10,TT(3));for(Vector<TT>::iterator iter =Vtt.begin();iter!= Vtt.end();++iter)cout<<*iter<<" ";cout<<endl;}void test2(){//测试插入Vector<int> Vint(10,2);Vector<int>::iterator iter =Vint.end();Vint.insert(----iter,2,3);Vint.push_back(4);for(iter=Vint.begin();iter!= Vint.end();++iter)cout<<*iter<<" ";cout<<endl;}void test3(){//测试删除Vector<int> Vint(10,2);Vector<int>::iterator iter =Vint.end();Vint.insert(----iter,2,3);Vint.push_back(4);for(iter=Vint.begin();iter!= Vint.end();++iter)cout<<*iter<<" ";cout<<endl;Vector<int>::iterator iter1 = Vint.find(Vint.begin(),Vint.end(),3);Vint.erase(iter1,Vint.end());for(iter=Vint.begin();iter!= Vint.end();++iter)cout<<*iter<<" ";cout<<endl;iter = Vint.end();Vint.erase(--iter);for(iter=Vint.begin();iter!= Vint.end();++iter)cout<<*iter<<" ";cout<<endl;}int main(){cout<<"----------test1---------"<<endl;test1();cout<<"----------test2---------"<<endl;test2();cout<<"----------test3---------"<<endl;test3();}


49 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 第五人格模拟器玩太卡怎么办 速腾油箱盖打不开怎么办 奥迪a6油箱盖打不开怎么办 苹果手提虚拟机黑屏怎么办 mac系统桌面变大怎么办 删除文件要权限怎么办 页面载入错误了怎么办 手机打不开excel表格怎么办 皇室战争闪退怎么办 苹果老是闪退怎么办 黑苹果开机黑屏怎么办 MAC磁盘删了怎么办 mac磁盘被锁定怎么办 bt5读不到网卡怎么办 笔记本电脑cpu温度过高怎么办 笔记本cpu温度过高怎么办 联想系统崩溃了怎么办 办公软件用不了怎么办 win10设置闪退怎么办 手机浏览器版本低怎么办 wps界面动不了怎么办 手机设置删了怎么办 苹果手机设置不见了怎么办 笔记本电脑键盘不好使怎么办 网咖怎么办临时卡 cydia添加雷锋源失败怎么办 电脑mac已锁定怎么办 苹果home键发热怎么办 苹果软件消失了怎么办 苹果键盘消失了怎么办 苹果图标消失了怎么办 超账户授权有误怎么办 华为账号码被盗怎么办 华为无法截屏怎么办 华为账号密码忘怎么办 华为忘记激活码怎么办 云充吧登录不上怎么办 充电器插头太松怎么办 充电器接口掉了怎么办 华为p9手机发烫怎么办 华为mate8不快充怎么办