vector的简易实现

  vector的简易实现整理自《数据结构与算法分析–C++描述(第3版)》3.4节“向量的实现”。详细可参考《STL源码分析》4.2节。

  具体实现代码如下:

  1 #ifndef VECTOR_H
  2 #define VECTOR_H
  3 
  4 #include <iostream>
  5 using namespace std;
  6 
  7 template<class T>
  8 class Vector
  9 {
 10 private:
 11     int theSize;
 12     int theCapacity;
 13     T *objects;
 14 
 15 public:
 16     typedef T* iterator;
 17     typedef const T* const_iterator;
 18     enum{ SPARE_CAPACITY = 16 };
 19 
 20 public:
 21     explicit Vector(int initSize = 0);    //用explicit避免隐式类型转换
 22     ~Vector();
 23     Vector(const Vector<T>& rhs);
 24     const Vector<T>& operator=(const Vector<T>& rhs);
 25 
 26     void resize(int newSize);
 27     void reserve(int newCapacity);
 28 
 29     T& operator[](int index);
 30     const T& operator[](int index) const;
 31 
 32     bool empty() const;
 33     int size() const;
 34     int capacity() const;
 35 
 36     void push_back(const T& x);
 37     void pop_back();
 38     const T& back() const;
 39 
 40     iterator begin();
 41     const_iterator begin() const;
 42 
 43     iterator end();
 44     const_iterator end() const;
 45 
 46 };
 47 
 48 template<class T>
 49 Vector<T>::Vector(int initSize = 0) : theSize(initSize), theCapacity(initSize + SPARE_CAPACITY)
 50 {
 51     objects = new T[theCapacity];
 52 }
 53 
 54 template<class T>
 55 Vector<T>::~Vector()
 56 {
 57     delete []objects;
 58 }
 59 
 60 template<class T>
 61 Vector<T>::Vector(const Vector<T>& rhs) : objects(nullptr)
 62 {
 63     operator = (rhs);
 64 }
 65 
 66 template<class T>
 67 const Vector<T>& Vector<T>::operator=(const Vector<T>& rhs)
 68 {
 69     if (this != &rhs)
 70     {
 71         delete[]objects;
 72         theSize = rhs.size();
 73         theCapcity = rhs.theCapacity;
 74 
 75         // 注意是深拷贝
 76         objects = new T[capacity()];
 77         for (int k = 0; k < size(); k++)
 78             objects[k] = rhs.objects[k];
 79     }
 80 
 81     return *this;
 82 }
 83 
 84 template<class T>
 85 void Vector<T>::resize(int newSize)
 86 {
 87     if (newSize > theCapacity)
 88         reserve(newSize * 2 + 1);    //每次空间不够的时候,就重新获得2倍于当前容量的空间,+1是为了防止0的情况
 89     theSize = newSize;
 90 }
 91 
 92 template<class T>
 93 void Vector<T>::reserve(int newCapacity)
 94 {
 95     if (newCapacity < theSize)
 96         return;
 97 
 98     T *oldArray = objects;
 99 
100     // 之所以需要将老的数组复制到新的数组,是因为要保证Vector整块内存的连续性
101     objects = new T[newCapacity];
102     for (int k = 0; k < theSize; k++)
103         objects[k] = oldArray[k];
104 
105     theCapacity = newCapacity;
106 
107     delete []oldArray;
108 }
109 
110 template<class T>
111 T& Vector<T>::operator[](int index)
112 {
113     return objects[index];
114 }
115 
116 template<class T>
117 const T& Vector<T>::operator[](int index) const
118 {
119     return objects[index];
120 }
121 
122 template<class T>
123 bool Vector<T>::empty() const
124 {
125     return size() == 0;
126 }
127 
128 template<class T>
129 int Vector<T>::size() const
130 {
131     return theSize;
132 }
133 
134 template<class T>
135 int Vector<T>::capacity() const
136 {
137     return theCapacity;
138 }
139 
140 template<class T>
141 void Vector<T>::push_back(const T& x)
142 {
143     if (theSize == theCapacity)
144         reserve(theCapacity * 2 + 1);
145     objects[theSize++] = x;
146 }
147 
148 template<class T>
149 void Vector<T>::pop_back()
150 {
151     theSize--;
152 }
153 
154 template<class T>
155 const T& Vector<T>::back() const
156 {
157     return objects[theSize - 1];
158 }
159 
160 template<class T>
161 T* Vector<T>::begin()
162 {
163     return &objects[0];
164 }
165 
166 template<class T>
167 const T* Vector<T>::begin() const
168 {
169     return &objects[0];
170 }
171 
172 template<class T>
173 T* Vector<T>::end()
174 {
175     return &objects[size() - 1];
176 }
177 
178 template<class T>
179 const T* Vector<T>::end() const
180 {
181     return &objects[size() - 1];
182 }
183 
184 #endif

 

   

posted @ 2015-08-05 23:48  峰子_仰望阳光  阅读(496)  评论(0编辑  收藏  举报