C 模板之Vector與STL初探

2022-05-23 03:33:11 字數 4119 閱讀 4125

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...