Vector——C++實現


  

  在學習數據結構的時候,考慮將所有的容器自己實現一遍,可以加深對數據結構的理解,同時需要運用拷貝控制和泛型編程的知識。

  vector特點:

  1、占據一塊連續的內存空間;

  2、內部實現是通過管理了一個指針,只是當內存空間不夠時,會重新分配一塊更大的內存空間,通常是將容量擴大一倍;

  3、vector對尾部操作很方便,對頭部或者插入都需要O(n)的時間復雜度;

  采用模板實現泛型類vector,為了支持大多數的編譯器,將實現文件全部放在頭文件中,不采用分離編譯的方式。

 

  說明:

  1、只實現了部分函數的功能,但是類似的可以定義其他的函數;

  2、迭代器只是采用定義為指針的方式,這種方式比較簡單,但是不能實現迭代器完全的功能。不過迭代器的本質也是將這個指針封裝成一個類。在我的另一篇博客里,通過實現了迭代器類來實現List可以參考:http://www.cnblogs.com/liuteng/p/6006533.html

  1 /************************************************************************/
  2 /* 對vector的實現                                                                     */
  3 /************************************************************************/
  4 #ifndef VECTOR_H
  5 #define VECTOR_H
  6 
  7 #define  SPACE_CAPACITY 5
  8 namespace stl
  9 {
 10     template<typename Object>
 11     class Vector
 12     {
 13     public:
 14         /************************************************************************/
 15         /*構造函數                                                              
 16         /************************************************************************/
 17         explicit Vector(int initsize = 0)                     //選擇Vector初始大小
 18             :theSize(initsize)
 19             ,theCapacity(initsize + SPACE_CAPACITY)
 20         {
 21             Objects = new Object[theCapacity];        //分配初始空間
 22         }
 23 
 24         /************************************************************************/
 25         /*拷貝構造函數*/                                                                      
 26         /************************************************************************/
 27         Vector(const Vector& V)
 28             :theSize(0)
 29             ,theCapacity(0)
 30             ,Objects(NULL)
 31         {
 32             *this = V;
 33         }
 34 
 35         /************************************************************************/
 36         /*析構函數                                                                      */
 37         /************************************************************************/
 38         ~Vector()
 39         {
 40             delete[ ] Objects;
 41         }
 42 
 43         /************************************************************************/
 44         /*重載賦值操作符                                                                      */
 45         /************************************************************************/
 46         Vector &operator = (const Vector& ths)                //需要定義成const型嗎?????
 47         {
 48             if (this != ths)        //防止與本身發生拷貝
 49             {
 50                 delete [] Objects;         //銷毀原來的內存空間
 51                 theSize = ths.theSize;
 52                 theCapacity = ths.theCapacity;
 53                 Objects = new Object[theCapacity];  //重新分配內存空間
 54                 //進行深層次的拷貝
 55                 /* Objects = ths.Objects  這是潛層次的拷貝,只拷貝了指針,
 56                 ** 如果原對象的對象發生改變,那么拷貝對象的內容也發生改變*/
 57                 for (int i = 0; i < ths.theSize; ++i)
 58                 {
 59                     Objects[i] = ths.Objects[i];
 60                 }
 61             }
 62             return *this;
 63         }
 64 
 65         /************************************************************************/
 66         /* 函數名:resize
 67         /* 功   能:改變size大小
 68         /* 說   明:改變theSize的大小,theCapacity大小不變
 69         /* 時   間:2016.10
 70         /************************************************************************/
 71         //resize后新定義的對象會怎樣被賦值????
 72         void resize(int newSize)
 73         {
 74             if (newSize <= theSize)
 75                 return;
 76             /*如果size大於capacity,則需要重新分配內存空間,內存空間大小是newsize的兩倍*/
 77             if(newSize > theCapacity)
 78                 reserve(2 * newSize + 1);         //+1是為了保證newsize為0時,為其分配1的空間,有必要嗎???
 79             theSize = newSize;
 80         }
 81 
 82         /************************************************************************/
 83         /* 函數名:reserve
 84         /* 功   能:重新分配內存空間大小
 85         /* 說   明:改變theCapacity的大小,theSize大小不變
 86         /* 時   間:2016.10
 87         /************************************************************************/
 88         void reserve(int newCapacity)
 89         {
 90             if (newCapacity < theSize)
 91             {
 92                 return;
 93             }
 94             /*把原有的內容拷貝到零食數組中*/
 95             Object * temp = Objects;
 96             /*為對象重新分配更大的內存空間*/
 97             Objects = new Object[newCapacity];
 98             /*把原來的數據拷貝回來,內存空間大小發生變化,但是size沒有變*/
 99             for (int i = 0;  i < theSize; ++i)
100             {
101                 Objects[i] = temp[i];
102             }
103             /*釋放原來的空間*/
104             delete[] temp;
105         }
106 
107         /************************************************************************/
108         /* 函數名:operate[]
109         /* 功   能:重載下標操作符
110         /* 說   明:非常量版本
111         /* 時   間:2016.10
112         /************************************************************************/
113         //下標運算符返回的是元素的引用,定義常量版本和非常量版本
114         Object& operator[] (int index)
115         {
116             return Objects[index];       //指針的下標運算
117         }
118 
119         /************************************************************************/
120         /* 函數名:operate[]
121         /* 功   能:重載下標操作符
122         /* 說   明:常量版本
123         /* 時   間:2016.10
124         /************************************************************************/
125         const Object& operator[] (int index) const
126         {
127             return Objects[index];
128         }
129 
130         /************************************************************************/
131         /* 函數名:isEmpty
132         /* 功   能:判斷Vector是否為空
133         /* 說   明:
134         /* 時   間:2016.10
135         /************************************************************************/
136         bool isEmpty() const
137         {
138             return size() == 0;
139         }
140 
141         /************************************************************************/
142         /* 函數名:size
143         /* 功   能:判斷Vector的大小
144         /* 說   明:
145         /* 時   間:2016.10
146         /************************************************************************/
147         int size() const
148         {
149             return theSize;
150         }
151 
152         /************************************************************************/
153         /* 函數名:capacity
154         /* 功   能:判斷Vector的capacity大小
155         /* 說   明:
156         /* 時   間:2016.10
157         /************************************************************************/
158         int capacity() const
159         {
160             return theCapacity;
161         }
162 
163         /************************************************************************/
164         /* 函數名:push_back
165         /* 功   能:在vector后面壓入一個數據
166         /* 說   明:
167         /* 時   間:2016.10
168         /************************************************************************/
169         void push_back(Object obj)
170         {
171             //判斷capacity的空間是否還有
172             if (theSize == theCapacity)
173             {
174                 //如果內存空間不夠,在現有size基礎上擴容一倍
175                 reserve(2 * theCapacity + 1);
176             }
177             //size表示元素的總個數,但是下標是從0開始計數,因此下標取不到size
178             Objects[theSize++] = obj;
179         }
180 
181         /************************************************************************/
182         /* 函數名:pop_back
183         /* 功   能:在vector后面刪除一個數據
184         /* 說   明:
185         /* 時   間:2016.10
186         /************************************************************************/
187         void pop_back()
188         {
189             --theSize;                  //是不是會導致訪問越界后出現的結果不可控的原因?????
190         }
191 
192         const Object & back() const
193         {
194             return Objects[size() - 1];
195         }
196 
197         typedef Object* iterator;
198         typedef const Object* const_iterator;
199 
200         iterator begin()
201         {
202             return &Objects[0];
203         }
204 
205         iterator end()
206         {
207             return &Objects[size()];
208         }
209 
210         const_iterator cbegin() const
211         {
212             return &Objects[0];
213         }
214 
215         const_iterator cend() const
216         {
217             return &Objects[size()];
218         }
219 
220     private:
221         int theSize;
222         int theCapacity;
223         Object* Objects;    //vector內部實際上是管理了一個數組指針,指向首元素的指針
224     };
225 }
226 #endif

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM