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