stl原始碼初步接觸
stl = standard template library,直譯過來是:標準模板庫,是惠普實驗室開發的一系列軟體的統稱。從根本上說,stl是一些「容器」的集合,這些「容器」有list,vector,set,map等,stl也是演算法和其他一些元件的集合。這裡的「容器」和演算法的集合指的是世界上很多聰明人很多年的傑作。stl的目的是標準化元件,這樣就不用重新開發,可以使用現成的元件。stl現在是c++的一部分,因此不用額外安裝什麼。stl所實現的,是依據泛型思維架設起來的乙個概念結構。說了這麼多還是不知道stl是個什麼東東,今天只是初接觸這個概念,感覺很高深的樣子,先這樣理解吧,stl就是乙個倉庫,乙個存放各種工具的倉庫。它的工具分為六大類(六大元件) :
容器(containers):各種資料結構,如vector,list,deque,set,map,用來存放底層資料。一般有序列式(下面要寫的vector就是個這種)、關聯式等。
演算法(algorithms):各種常用演算法如:sort,search,copy,erase……
迭代器(iterator):扮演容器與演算法之間的膠合劑,是所謂的「泛型指標」,共5種型別,以及他們的衍生變化。所有的stl容器都附帶有自己專屬的迭代器。原生指標也是一種迭代器。
仿函式(functor):行為類似函式可作為演算法的某種策略。一般函式指標可認為是俠義的仿函式。
配接器(adapter):一種用來修飾容器,或仿函式,或迭代器介面的東西。
配置器(allocators)負責空間配置與管理。配置器是乙個實現了動態空間配置、空間管理、空間釋放的class template。
因為下面主要是實現vector的簡單操作,所以就再多講一點它。vector是動態空間,隨著元素的加入,它的內部機制會自行擴充空間以容納新元素。因此vector的運用對於記憶體的合理運用與運用得靈活性有很大的幫助。vector維護的是乙個連續的空間,無論元素的型別為何,普通指標都可以作為vector的迭代器而滿足所有必要條件。
vector 的簡單實現:
1其中,注釋掉的**部分是我曾經踩過的坑,下面是部分測試**#pragma once
2 #include3 #include4 #include5
using
namespace
std;
6 template
7class
vector 8
18 vector(const vector&v) 19
//:start(new t[v.endofstorage - v.start])
20//
, finish(v.finish )
21//
, endofstorage(v.endofstorage)
22 :start(new t[v.endofstorage -v.start])
23 , finish(start + (v.finish -v.start))
24 ,endofstorage(start + (v.endofstorage -v.start)) 27
//向vector中存入size個元素
28vector(citerator array, size_t size)
29 :start(new
t[size]) 30
, finish(start)
31 , endofstorage(start +size) 35
} 36 vector&operator=(const vector&v) 41
return *this;
42}43 ~vector() 52
} 53//
返回首元素的迭代器
54iterator begin()
57 citerator begin()const 60
//獲取vector中最後乙個元素的下乙個位置
61iterator end()
64 iterator end()const
67 size_t size()const
70 size_t capacity()const 73
bool empty()const
76 t& operator
(size_t index) 79
const t& operator(size_t index)const
82 t&at(size_t index) 86
const t& at(size_t index)const 90
//獲取vector中的第乙個元素
91 t&front() 94
const t& front()const 97
//獲取vector中的最後乙個元素
98 t&back()
101const t& back()const
104void pushback(const t&x)
110void
popback()
114}
115//
在pos位置上插入元素x
116 iterator insert(iterator pos, const t&x)
120 *pos =x;
121 finish++;
122return
pos;
123}
124//
刪除pos位置上面的元素
125iterator erase(iterator pos)
129 finish--;
130return
pos;
131}
132//
給vector賦值n個值為x的元素
133void assign(size_t n, const t&x)
140}
141else
145 finish = start +n;
146}
147public
:
//自己管理 擴容
148void
capacity()
160}
161void swap(vector&v)
166void
print()
171 cout <
172}
173void* my_memcopy(void* dest, const
void*src, size_t sz)
183return
dest;
184}
185private
:186
iterator start;
187iterator finish;
188iterator endofstorage;
189 };
注意:擴容時函式中my_memcpy()函式,它的本質就是值拷貝,當vector中存放的內建型別時沒有任何問題,但是像string類這種問題就無法解決。所以下面給出了另一種寫法。
1/*iterator pos = start;
2size_t index = 0;
3while (pos < endofstprage)
4temp[index++] = *pos++;
5deleta start;
6start = temp;
7finish = start + index;
8endofstorage = start + capacity;
*/
C 標準模板庫(STL)之vector
vector即長度可變的陣列 標頭檔案宣告 include using namespace std 1.定義 vector int v vectorint age 兩個 之間需加空格,不然會被誤以為是移位操作 vector int vi 100 vector陣列,vi 0 vi 99 每乙個都是乙個...
C 標準模板庫(STL)之 vector
一 vector的常見用法詳解 1.vector的定義 標頭檔案 include 單獨定義乙個vector vectorname 注 如果typename也是乙個stl容器,定義的時候要記得在 符號之間加上空格,因為一些使用c 11之前標準的編譯器會把它視為移位操作,導致編譯錯誤。如果typenam...
STL模板之vector與sort的使用
演算法學習 題目 輸入任意 使用者,成績 序列,可以獲得成績從高到低或從低到高的排列,相同成績.都按先錄入排列在前的規則處理。例示 jack 70 peter 96 tom 70 smith 67 從高到低 成績 peter 96 jack 70 tom 70 smith 67 從低到高 成績 sm...