vector的实现

  1. #include <iostream>  
  2. #include <assert.h>  
  3. using namespace std;  
  4.   
  5. //<span style="color:#ff0000;">类型萃取</span>  
  6. struct TrueType  
  7. {  
  8.     bool Get()  
  9.     {  
  10.         return true;  
  11.     }  
  12. };  
  13. struct FalseType  
  14. {  
  15.     bool Get()  
  16.     {  
  17.         return false;  
  18.     }  
  19. };  
  20.   
  21. template <class Tp>  
  22. struct TypeTraits  
  23. {  
  24.     typedef FalseType IsPODType;  
  25. };  
  26.   
  27. template<>  
  28. struct TypeTraits<bool>//bool类型的特化  
  29. {  
  30.     typedef TrueType IsPODType;  
  31. };  
  32. template<>  
  33. struct TypeTraits<int>  
  34. {  
  35.     typedef TrueType IsPODType;  
  36. };  
  37. template<>  
  38. struct TypeTraits<short>  
  39. {  
  40.     typedef TrueType IsPODType;  
  41. };  
  42. template<>  
  43. struct TypeTraits<long>  
  44. {  
  45.     typedef TrueType IsPODType;  
  46. };  
  47. template<>  
  48. struct TypeTraits<char>  
  49. {  
  50.     typedef TrueType IsPODType;  
  51. };  
  52. template<>  
  53. struct TypeTraits<long long>  
  54. {  
  55.     typedef TrueType IsPODType;  
  56. };  
  57. template<>  
  58. struct TypeTraits<unsigned int>  
  59. {  
  60.     typedef TrueType IsPODType;  
  61. };  
  62. template<>  
  63. struct TypeTraits<unsigned char>  
  64. {  
  65.     typedef TrueType IsPODType;  
  66. };  
  67. template<>  
  68. struct TypeTraits<unsigned short>  
  69. {  
  70.     typedef TrueType IsPODType;  
  71. };  
  72.   
  73.   
  74.   
  75. //Vector模拟  
  76. template <typename T>  
  77. class Vector  
  78. {  
  79. public:  
  80.     typedef T* Iterator;  
  81.     typedef const T* ConstIterator;  
  82.     //construcor  
  83.     Vector()  
  84.         :_start(0)  
  85.         ,_last(0)  
  86.         ,_endofstorage(0)  
  87.     {}  
  88.     //普通版本的拷贝构造  
  89.     Vector(const Vector<T>& v)  
  90.         :_start(new T[v.Size()])  
  91.     {  
  92.         _last = _start + v.Size();  
  93.         _endofstorage = _start + v.Capacity();  
  94.         //类型萃取  
  95.         if (TypeTraits<T>::IsPODType().Get())  
  96.         {  
  97.             //内置类型  
  98.             memcpy(_start,v._start,v.Size()*sizeof(T));  
  99.         }  
  100.         else  
  101.         {  
  102.             //自定义类型  
  103.             for(size_t i = 0; i<v.Size(); i++)  
  104.             {  
  105.                 _start[i] = v._start[i];  
  106.             }  
  107.         }  
  108.     }  
  109.     简洁版的拷贝构造函数  
  110.     //Vector(const Vector<T>& v)  
  111.     //  :_start(NULL)  
  112.     //{  
  113.     //  T* tmp(v._start);  
  114.     //  swap(_start,tmp);  
  115.     //  _last = _start + v.Size();  
  116.     //  _endofstorage = _start + v.Capacity();  
  117.     //}  
  118.   
  119.     //普通版本的赋值运算符重载  
  120.     Vector& operator=(const Vector<T>& v)  
  121.     {  
  122.         if (_start != v._start)  
  123.         {  
  124.             T* tmp = new T[v.Capacity()];  
  125.             //类型萃取  
  126.             if (TypeTraits<T>::IsPODType().Get())  
  127.             {  
  128.                 //内置类型  
  129.                 memcpy(tmp,v._start,v.Size()*sizeof(T));  
  130.             }  
  131.             else  
  132.             {  
  133.                 //自定义类型  
  134.                 for(size_t i = 0; i<v.Size(); i++)  
  135.                 {  
  136.                     tmp[i] = v._start[i];  
  137.                 }  
  138.             }  
  139.             delete []_start;  
  140.             _start = tmp;  
  141.             _last = _start + v.Size();  
  142.             _endofstorage = _start + v.Capacity();  
  143.         }  
  144.         return *this;  
  145.     }  
  146.     简洁版的赋值运算符重载<1>  
  147.     //Vector& operator=(const Vector<T>& v)  
  148.     //{  
  149.     //  if (_start != v._start)//排除自己给自己赋值  
  150.     //  {  
  151.     //      Vector<T> tmp(v);//创建临时变量,辅助交换  
  152.     //      swap(_start,tmp._start);  
  153.     //      _last = _start + v.Size();  
  154.     //      _endofstorage = _start + v.Capacity();  
  155.     //  }  
  156.     //  return *this;  
  157.     //}  
  158.     //简洁版的赋值运算符重载<2>  
  159.     //Vector& operator=(Vector<T> v)  
  160.     //{  
  161.     //  size_t size = v.Size();//先保存元素个数  
  162.     //  size_t capacity = v.Capacity();//保存容量  
  163.     //  swap(_start,v._start);//直接交换  
  164.     //  _last = _start + size;  
  165.     //  _endofstorage = _start + capacity;  
  166.     //  return *this;  
  167.     //}  
  168.   
  169.     ~Vector()  
  170.     {  
  171.         if(_start)  
  172.         {  
  173.             delete []_start;  
  174.             _start = NULL;  
  175.         }  
  176.     }  
  177.   
  178.     //Iterator  
  179.     Iterator Begin()  
  180.     {  
  181.         assert(_start);  
  182.         return _start;  
  183.     }  
  184.     ConstIterator Begin()const  
  185.     {  
  186.         assert(_start);  
  187.         return _start;  
  188.     }  
  189.     Iterator End()  
  190.     {  
  191.         assert(_last);  
  192.         return _last;  
  193.     }  
  194.     ConstIterator End()const  
  195.     {  
  196.         assert(_last);  
  197.         return _last;  
  198.     }  
  199.   
  200.     //capacity  
  201.     size_t Size()const  
  202.     {  
  203.         return (_last - _start);  
  204.     }  
  205.     size_t Capacity()const  
  206.     {  
  207.         return (_endofstorage - _start);  
  208.     }  
  209.     bool Empty()  
  210.     {  
  211.         return Size()==0;  
  212.     }  
  213.     void Resize(size_t sz)  
  214.     {  
  215.         if (Size() > sz)  
  216.         {  
  217.             _last = _start + sz;  
  218.         }  
  219.         else if(Size() == sz)  
  220.         {  
  221.             ;  
  222.         }  
  223.         else  
  224.         {  
  225.             size_t size = Size();  
  226.             _last = _start + sz;  
  227.             CheckCapacity();  
  228.             for (size_t i = size; i<sz; i++)  
  229.             {  
  230.                 _start[i] = 0;//设默认值为0  
  231.             }  
  232.         }  
  233.     }  
  234.     void Reserve(size_t sz)  
  235.     {  
  236.         if (Capacity() > sz)  
  237.         {  
  238.             _endofstorage = _start + sz;  
  239.         }  
  240.         else if(Capacity() == sz)  
  241.         {  
  242.             ;  
  243.         }  
  244.         else  
  245.         {  
  246.             _endofstorage = _start + sz;  
  247.             CheckCapacity();  
  248.         }  
  249.     }  
  250.   
  251.     //Element access  
  252.     T& operator[](size_t index)  
  253.     {  
  254.         assert(index>=0 && index<Size());  
  255.         return _start[index];  
  256.     }  
  257.     T Front()  
  258.     {  
  259.         assert(_start);  
  260.         return *Begin();  
  261.     }  
  262.     const T Front()const  
  263.     {  
  264.         assert(_start);  
  265.         return *Begin();  
  266.     }  
  267.     T Back()  
  268.     {  
  269.         assert(_last);  
  270.         return *(_last - 1);  
  271.     }  
  272.     const T Back()const  
  273.     {  
  274.         assert(_last);  
  275.         return *(_last - 1);  
  276.     }  
  277.   
  278.     //modifities  
  279.     void PushBack(const T& x)  
  280.     {  
  281.         CheckCapacity();  
  282.         Insert(_last,x);  
  283.     }  
  284.     void PopBack()  
  285.     {  
  286.         assert(_start != _last);  
  287.         Erase(_last-1);  
  288.     }  
  289.     Iterator Find(const T& data)  
  290.     {  
  291.         Vector<T>::Iterator it = Begin();  
  292.         while(it != End())  
  293.         {  
  294.             if(*it == data)  
  295.                 break;  
  296.             it++;  
  297.         }  
  298.         return it;  
  299.     }  
  300.     Iterator Insert(Iterator pos, const T& x )  
  301.     {  
  302.         assert(pos>=_start && pos<=_last);  
  303.         CheckCapacity();  
  304.         if (pos == _start)//容器中无元素  
  305.         {  
  306.             *_start = x;  
  307.         }  
  308.         else if(pos == _last)//尾插  
  309.         {  
  310.             *_last = x;  
  311.         }  
  312.         else  
  313.         {  
  314.             size_t tmp = _last - pos;  
  315.             size_t i = 0;  
  316.             for (i = Size(); i >= tmp; i--)//将后面的元素向后移  
  317.             {  
  318.                 _start[i] = _start[i-1];  
  319.             }  
  320.             _start[i] = x;  
  321.         }  
  322.         _last++;  
  323.           
  324.         return  pos;  
  325.     }  
  326.     Iterator Erase(Iterator pos)  
  327.     {  
  328.         assert(_start != _last);  
  329.         if (pos == _last-1)//尾删  
  330.         {  
  331.             ;  
  332.         }  
  333.         else  
  334.         {  
  335.             size_t tmp = pos - _start;  
  336.             for (size_t i = tmp; i < Size()-1; i++)//将pos后面的元素向前移  
  337.             {  
  338.                 _start[i] = _start[i+1];  
  339.             }  
  340.         }  
  341.         _last--;  
  342.         return pos+1;  
  343.     }  
  344.     void Clear()//只清数据,不清空间  
  345.     {  
  346.         assert(_start != _last);  
  347.         _last = _start;  
  348.     }  
  349.     void Swap(Vector<T>& v)  
  350.     {  
  351.         Vector<T> tmp(v);  
  352.   
  353.         v = *this;  
  354.         *this = tmp;  
  355.     }  
  356. private:  
  357.     void CheckCapacity()//检查容量  
  358.     {  
  359.         if(Size() >= Capacity())//说明需要扩容  
  360.         {  
  361.             size_t size = Size();  
  362.             size_t capacity = Capacity()*2 +3;  
  363.             Iterator tmp = new T[capacity];  
  364.             //类型萃取  
  365.             if (TypeTraits<T>::IsPODType().Get())  
  366.             {  
  367.                 //内置类型  
  368.                 memcpy(tmp,_start,size*sizeof(T));  
  369.             }  
  370.             else  
  371.             {  
  372.                 //自定义类型  
  373.                 for(size_t i = 0; i<size; i++)  
  374.                 {  
  375.                     tmp[i] = _start[i];  
  376.                 }  
  377.             }  
  378.   
  379.             delete []_start;  
  380.             _start = tmp;  
  381.             _last = _start + size;  
  382.             _endofstorage = _start + capacity;  
  383.         }  
  384.     }  
  385.   
  386. protected:  
  387.     Iterator _start;//存放第一个元素的位置  
  388.     Iterator _last;//最后一个元素的下一个位置  
  389.     Iterator _endofstorage;//已开辟容量的下一个位置  
  390. };  
  391.   
  392. template <typename T>  
  393. void PrintVector(Vector<T>& v)  
  394. {  
  395.     Vector<int>::Iterator it1 = v.Begin();  
  396.     while(it1 != v.End())  
  397.     {  
  398.         cout<<*it1<<" ";  
  399.         it1++;  
  400.     }  
  401.     cout<<endl;  
  402. }  
  403. template <typename T>  
  404. void PrintConstVector(Vector<T>& v)  
  405. {  
  406.     Vector<int>::ConstIterator it1 = v.Begin();  
  407.     while(it1 != v.End())  
  408.     {  
  409.         cout<<*it1<<" ";  
  410.         it1++;  
  411.     }  
  412.     cout<<endl;  
  413. }  
  414.   
  415. void TestVector()  
  416. {  
  417.     Vector<int> v1;  
  418.     cout<<"v1.Size():"<<v1.Size()<<endl;  
  419.     cout<<"v1.Capacity():"<<v1.Capacity()<<endl;  
  420.     v1.PushBack(1);  
  421.     v1.PushBack(2);  
  422.     v1.PushBack(3);  
  423.     v1.PushBack(4);  
  424.     cout<<"v1.Size():"<<v1.Size()<<endl;  
  425.     cout<<"v1.Capacity():"<<v1.Capacity()<<endl;  
  426.     PrintVector(v1);  
  427.     Vector<int> v2(v1);  
  428.     PrintVector(v2);  
  429.     Vector<int> v3;  
  430.     v3 = v2;  
  431.     PrintVector(v3);  
  432.   
  433.     v3.Resize(10);//>size  
  434.     PrintVector(v3);  
  435.     v3.Resize(3);//<size  
  436.     PrintVector(v3);  
  437.     v3.Reserve(5);//>capacity  
  438.     cout<<v3.Capacity()<<endl;  
  439.     v3.Reserve(0);//<capacity  
  440.     cout<<v3.Capacity()<<endl;  
  441.   
  442.     cout<<v2.Front()<<endl;  
  443.     cout<<v2.Back()<<endl;  
  444.     PrintVector(v2);  
  445.     v2.PopBack();  
  446.     PrintVector(v2);  
  447.     v2.Insert(v2.Find(2),6);  
  448.     PrintVector(v2);  
  449.     v2.Erase(v2.Find(1));  
  450.     PrintVector(v2);  
  451.   
  452.     v2.Clear();//只清数据,不清空间  
  453.     cout<<"v2.Size():"<<v2.Size()<<endl;  
  454.     cout<<"v2.Capacity():"<<v2.Capacity()<<endl;  
  455.     v2.Swap(v1);  
  456.     PrintVector(v2);  
  457. }  
  458.   
  459. int main()  
  460. {  
  461.     TestVector();  
  462.     system("pause");  
  463.     return 0;  
  464. }  
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值