STL基礎知識

一,STL的組成

1.什麼是STL

  STL(Standard Template Library)標準模板庫的簡稱,是由惠普開發的一系列軟件的總稱,STL現在是C++的一部分,已經被構建於編譯系統之內,所以不需要再引入。

2.STL的組成部分

  • 容器(containers):是一種數據結構容器,使用類模板的方式提供,我們可以方便的進行數據的存儲操作。
  • 適配器(adapters):以序列式容器爲基礎,提供的棧,隊列和優先級隊列的這種容器。
  • 迭代器(iterators):類似於指針,用來操作容器的對象。
  • 算法(algorithm):包含一系列的常見算法。
  • 空間配置器(allocator):其中主要工作包括兩部分:1,對象的創建與銷燬。2,內存的創建與釋放。
  • 仿函數(functor):仿函數又稱爲函數對象,其實就是重載了()操作符的struct,沒有什麼特別的地方。

二,容器

1,序列式容器

  • 每個元素都有固定位置,取決於插入時機和地點。與元素值無關。
  • vector(向量):底層數據結構是數組,可以隨機存取數據元素(用索引直接存取),數組的尾部添加和移除元素很快,但在頭部和中部插入元素比較耗時。
  • deque(雙端隊列):底層數據結構是數組,可以隨機存取數據元素,在數組的頭部和尾部插入和刪除元素很快。
  • list(列表):底層數據結構是雙向鏈表,不提供隨機存取數據元素(需要按順序走到要存取的元素),在任何位置插入和刪除都很快,只需要簡單的移動一下指針。

2,關聯式容器

  • 元素位置取決於特定的排序準則,和插入的順序無關,底層數據結構爲二叉樹。
  • set(集合):內部元素依據其值自動排序,set內相同的數值元素只能出現一次。
  • multiset(多重集合):內部元素依據其值自動排序,set內允許出現重複的元素。
  • map(映射):map的元素是成對的鍵值對,內部元素的值依據鍵自動排序,鍵只允許出現一次。
  • multimap(多重映射):多重映射是map的增強版,允許鍵出現多次。

三,適配器

1.什麼是適配器

  STL提供了三種適配器stack,queue和priority_queue。這些適配器是包裝了序列式容器(vector,deque,list)中的一種。因此所謂的適配器就是序列式容器的包裝器,注意:適配器沒有提供迭代器。

2.stack(棧)

  棧可以使用序列式容器中的vector,deque,list中的任意一種作爲其底層的數據結構。默認是使用deque來實現的stack。

3.queue(隊列)

  隊列可以使用deque和list中的任意一種作爲其底層的數據結構。默認是使用deque來實現的queue。

4.priority_queue(優先隊列)

  優先隊列也是一種隊列,不過在進入隊列之後會對元素進行排序,可以使用vector和deque來實現其底層結構,默認是使用vector來實現priority_queue。

5.序列式容器和適配器比較

  

四、迭代器(Adapter)

迭代器是用類模板(class template)實現的.重載了* ,-> ,++ ,-- 等運算符。

迭代器分5種:輸入迭代器、輸出迭代器、 前面迭代器、雙向迭代器、 隨機訪問迭代器。

輸入迭代器:向前讀(只允許讀);

輸出迭代器:向前寫(只允許寫);

前向迭代器:向前讀寫;

雙向迭代器:向前後讀寫;

隨機迭代器:隨機讀寫;


五、算法(Algorithm)

算法部分主要在頭文件<algorithm>,<numeric>,<functional>中。<algoritm>是所有STL頭文件中最大的一個,它是由一大堆模版函數組成的,可以認爲每個函數在很大程度上都是獨立的,其中常用到的功能範 圍涉及到比較、交換、查找、遍歷操作、複製、修改、移除、反轉、排序、合併等等。<numeric>體積很小,只包括幾個在序列上面進行簡單數學運算的模板函數,包括加法和乘法在序列上的一些操作。<functional>中則定義了一些模板類,用以聲明函數對象。

六、仿函數(Functor)

仿函數用類模板實現,重載了符號"()"。仿函數,又或叫做函數對象,是STL六大組件之一;仿函數雖然小,但卻極大的拓展了算法的功能,幾乎所有的算法都有仿函數版本。

例如,查找算法find_if就是對find算法的擴展,標準的查找是兩個元素相等就找到了,但是什麼是相等在不同情況下卻需要不同的定義,如地址相等,地址和郵編都相等,雖然這些相等的定義在變,但算法本身卻不需要改變,這都多虧了仿函數。仿函數(functor)又稱之爲函數對象(function object),其實就是重載了()操作符的struct,沒有什麼特別的地方。

仿函數的優勢:

1)仿函數比一般函數靈活。

2)仿函數有類型識別。可以用作模板參數。

3)執行速度上仿函數比函數和指針要更快。

七、空間配置器(Allocator)

STL內存配置器爲容器分配並管理內存。統一的內存管理使得STL庫的可用性、可移植行、以及效率都有了很大的提升。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章