STL源碼初步接觸

   STL = Standard Template Library,直譯過來是:標(biāo)準(zhǔn)模板庫,是惠普實(shí)驗(yàn)室開發(fā)的一系列軟件的統(tǒng)稱。從根本上說,STL是一些“容器”的集合,這些“容器”有l(wèi)ist,vector,set,map等,STL也是算法和其他一些組件的集合。這里的“容器”和算法的集合指的是世界上很多聰明人很多年的杰作。STL的目的是標(biāo)準(zhǔn)化組件,這樣就不用重新開發(fā),可以使用現(xiàn)成的組件。STL現(xiàn)在是C++的一部分,因此不用額外安裝什么。STL所實(shí)現(xiàn)的,是依據(jù)泛型思維架設(shè)起來的一個(gè)概念結(jié)構(gòu)。說了這么多還是不知道STL是個(gè)什么東東,今天只是初接觸這個(gè)概念,感覺很高深的樣子,先這樣理解吧,STL就是一個(gè)倉庫,一個(gè)存放各種工具的倉庫。它的工具分為六大類(六大組件) :

容器(containers):各種數(shù)據(jù)結(jié)構(gòu),如Vector,list,deque,set,map,用來存放底層數(shù)據(jù)。一般有序列式(下面要寫的Vector就是個(gè)這種)、關(guān)聯(lián)式等。

算法(algorithms):各種常用算法如:sort,search,copy,erase……

迭代器(iterator):扮演容器與算法之間的膠合劑,是所謂的“泛型指針”,共5種類型,以及他們的衍生變化。所有的STL容器都附帶有自己專屬的迭代器。原生指針也是一種迭代器。

仿函數(shù)(functor):行為類似函數(shù)可作為算法的某種策略。一般函數(shù)指針可認(rèn)為是俠義的仿函數(shù)。

配接器(adapter):一種用來修飾容器,或仿函數(shù),或迭代器接口的東西。

配置器(allocators)負(fù)責(zé)空間配置與管理。配置器是一個(gè)實(shí)現(xiàn)了動(dòng)態(tài)空間配置、空間管理、空間釋放的class template。

因?yàn)橄旅嬷饕菍?shí)現(xiàn)Vector的簡(jiǎn)單操作,所以就再多講一點(diǎn)它。Vector是動(dòng)態(tài)空間,隨著元素的加入,它的內(nèi)部機(jī)制會(huì)自行擴(kuò)充空間以容納新元素。因此Vector的運(yùn)用對(duì)于內(nèi)存的合理運(yùn)用與運(yùn)用得靈活性有很大的幫助。Vector維護(hù)的是一個(gè)連續(xù)的空間,無論元素的型別為何,普通指針都可以作為Vector的迭代器而滿足所有必要條件。電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

Vector 的簡(jiǎn)單實(shí)現(xiàn):

電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

  1 #pragma once
  2 #include<iostream>
  3 #include<assert.h>
  4 #include<stdlib.h>
  5 using namespace

/*Iterator pos = start;
size_t index = 0;
while (pos < endofstprage)
temp[index++] = *pos++;
deleta[] start;
start = temp;
finish = start + index;
endofstorage = start + capacity;*/

159         }
160     }
161     void swap(Vector<T>& v) {
162         std::swap(start, v.start);
163         std::swap(finish, v.finish);
164         std::swap(endofstorage, v.endofstorage);
165     }
166     void Print() {    
167             for (size_t i = 0; i < Size(); i++)
168             {
169                 cout << start[i] << " ";
170             }
171             cout << endl;    
172     }
173     void* my_memcopy(void* dest, const void* src, size_t sz) {
174         //assert(!dest || !src);
175         assert(dest != NULL || src != NULL);
176         char* ret = (char*)dest;
177         char* tmp = (char*)src;
178         while (sz--) {
179             *ret = *tmp;
180             ret++;
181             tmp++;
182         }
183         return dest;
184     }
185 private:
186     Iterator start;
187     Iterator finish;
188     Iterator endofstorage;
189 };

電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

之中,注釋掉的代碼部分是我曾經(jīng)踩過的坑,下面是部分測(cè)試代碼

電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

 1 #include"vector.h"
 2 void Test1()
 3 {
 4     Vector<int> list1;
 5     list1.PushBack(1);
 6     list1.PushBack(2);
 7     list1.PushBack(3);
 8     list1.PushBack(4);
 9     list1.PushBack(5);
10     list1.Print();
11     Vector<int> list2;
12     list2.PushBack(0);
13     list2.PushBack(9);
14     list2.PushBack(8);
15     list2.PushBack(7);
16     list2.PushBack(6);
17     list2.Print();
18     list1 = list2;
19     list1.Print();
20 }
21 void Test2()
22 {
23     Vector<int> list1;
24     list1.PushBack(1);
25     list1.PushBack(2);
26     list1.PushBack(3);
27     list1.PushBack(4);
28     list1.PushBack(5);
29     list1.Print();
30     list1.PopBack();
31     list1.Print();
32     list1.Insert(&list1.At(2), 0);
33     list1.Print();
34     list1.Erase(&list1.At(3));
35     list1.Print();
36 }
37 int main()
38 {
39     Test1();
40     Test2();
41     getchar();
42     return 0;
43 }

電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

注意:擴(kuò)容時(shí)函數(shù)中my_memcpy()函數(shù),它的本質(zhì)就是值拷貝,當(dāng)Vector中存放的內(nèi)置類型時(shí)沒有任何問題,但是像String類這種問題就無法解決。所以下面給出了另一種寫法。

/*Iterator pos = start;
size_t index = 0;
while (pos < endofstprage)
temp[index++] = *pos++;
deleta[] start;
start = temp;
finish = start + index;
endofstorage = start + capacity;*/

http://www.cnblogs.com/33debug/p/6718613.html