前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Vector重写

Vector重写

作者头像
对弈
发布2019-09-04 15:51:31
1.1K0
发布2019-09-04 15:51:31
举报
  1. #ifndef _vec_h
  2. #define _vec_h
  3. #include<memory>
  4. #include<algorithm>
  5. //#include<cstddef>
  6. template<class T> class Vec{
  7. public:
  8. typedef T* iterator;
  9. typedef const T* const_iterator;
  10. typedef size_t size_type;
  11.     Vec() {create();    }
  12. explicit Vec(size_type n,const T& t=T()) {create(n,t);}
  13.     Vec(const Vec& v) {create(v.begin(),v.end());}   //复制构造函数跟构造函数一样,没有返回值
  14.     Vec& operator=(const Vec&);       //类外定义
  15.     ~Vec() {uncreate();}
  16.     T& operator {return datai;}
  17. const T& operatorconst {return datai;}
  18.     iterator begin() {return data;  }
  19.     const_iterator begin() const{return data;   }
  20.     iterator end() {return avail;   }
  21.     const_iterator end() const {return avail;   }
  22.     size_type size() const{return avail-data;}
  23. void push_back(const T&);
  24. private:
  25.     iterator data,avail,limit;
  26.     std::allocator<T> alloc;
  27. void create();
  28. void create(size_type,const T&);
  29. void create(const_iterator,const_iterator);
  30. void uncreate();
  31. void grow();
  32. void unchecked_appended(const T&);
  33. };
  34. #endif
  35. template <class T> void Vec<T>::create(){
  36.     data=avail=limit=0;
  37. }
  38. template <class T> void Vec<T>::create(size_type n,const T& t){
  39.     data=alloc.allocate(n);
  40.     avail=limit=data+n;
  41.     std::uninitialized_fill(data,limit,t);
  42. }
  43. template <class T> void Vec<T>::create(const_iterator i,const_iterator j){
  44.     data=alloc.allocate(j-i);
  45.     avail=limit=std::uninitialized_copy(i,j,data);
  46. }
  47. template <class T> void Vec<T>::uncreate(){
  48. if(data){
  49.       iterator i=avail;
  50. while(i!=data)
  51.         alloc.destroy(--i);
  52.       alloc.deallocate(data,limit-data);
  53.     }
  54.     data=avail=limit=0;
  55. }
  56. template <class T> void Vec<T>::grow(){
  57.     size_type maxlen;
  58.     maxlen=std::max(2*(limit-data),ptrdiff_t(1));            //确定vector容量
  59.     iterator new_data,new_avail;
  60.     new_data=alloc.allocate(maxlen);                    //申请未初始化的内存空间
  61.     new_avail=std::uninitialized_copy(data,avail,new_data);       //拷贝工作
  62.     uncreate();                                             //删除工作
  63.     data=new_data;
  64.     avail=new_avail;
  65.     limit=data+maxlen;                               //更新limit
  66. }
  67. template <class T> void Vec<T>::unchecked_appended(const T& v){
  68.     alloc.construct(avail++,v);                             //特别注意这里在未初始化的内存中构造v对象
  69. }
  70. template <class T> Vec<T>& Vec<T>::operator=(const Vec& v){
  71. if(&v != this){
  72.         uncreate();
  73.         create(v.begin(),v.end());
  74.     }
  75. return *this;
  76. }
  77. template <class T> void Vec<T>:: push_back(const T& v){
  78. if(avail==limit)
  79.         grow();
  80.     unchecked_appended(v);
  81. }

测试例程

cpp view plain copy

  1. #include"vec.h"
  2. #include<iostream>
  3. using namespace std;
  4. int main(){
  5.     Vec<int> v;
  6.     cout<<v.size()<<endl;
  7.     v.push_back(1);
  8.     v.push_back(12);
  9.     v.push_back(51);
  10.     v.push_back(136);
  11.     Vec<int>::iterator i;
  12. for(i=v.begin();i!=v.end();i++)
  13.       cout<< *i <<"\t";
  14.     cout<<endl;
  15.     Vec<int> v1=v;
  16. for(i=v1.begin();i!=v1.end();i++)
  17.       cout<< *i <<"\t";
  18.     cout<<endl;
  19.     Vec<int> v3(v);
  20. for(i=v3.begin();i!=v3.end();i++)
  21.       cout<< *i <<"\t";
  22.     cout<<endl;
  23.     v3.push_back(112);
  24.     v3.push_back(172);
  25.     v3.push_back(120);
  26. for(i=v3.begin();i!=v3.end();i++)
  27.       cout<< *i <<"\t";
  28. }

声明:本文为原创,作者为 对弈,转载时请保留本声明及附带文章链接:https://cloud.tencent.com/developer/article/1498813

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-08-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档