概述
長久以來,軟件界一直希望建立一種可重復利用的東西,以及一種得以制造出”可重復運用的東西”的方法,從函數(functions),類別(classes),函數庫(function libraries),類別庫(class libraries)、各種組件,從模塊化設計,到面向對象(object oriented ),為的就是復用性的提升。
復用性必須建立在某種標准之上。但是在許多環境下,就連軟件開發最基本的數據結構(data structures) 和算法(algorithm)都未能有一套標准。大量程序員被迫從事大量重復的工作,竟然是為了完成前人已經完成而自己手上並未擁有的程序代碼,這不僅是人力資源的浪費,也是挫折與痛苦的來源。
為了建立數據結構和算法的一套標准,並且降低他們之間的耦合關系,以提升各自的獨立性、彈性、交互操作性(相互合作性,interoperability),誕生了STL。
STL(Standard Template Library,標准模板庫),是惠普實驗室開發的一系列軟件的統稱。現在主要出現在 c++中,但是在引入 c++之前該技術已經存在很長時間了。
STL 從廣義上分為: 容器(container) 算法(algorithm) 迭代器(iterator)。
容器和算法之間通過迭代器進行無縫連接。STL 幾乎所有的代碼都采用了模板類或者模板函數,這相比傳統的由函數和類組成的庫來說提供了更好的代碼重用機會。
STL(Standard Template Library)標准模板庫,在我們 c++標准程序庫中隸屬於 STL 的占到了 80%以上。
STL六大組件簡介
STL提供了六大組件,彼此之間可以組合套用,這六大組件分別是:容器、算法、迭代器、仿函數、適配器(配接器)、空間配置器。
容器
各種數據結構,如vector、list、deque、set、map等,用來存放數據,從實現角度來看,STL容器是一種class template。
算法
各種常用的算法,如sort、find、copy、for_each。從實現的角度來看,STL算法是一種function tempalte.
迭代器
扮演了容器與算法之間的膠合劑,共有五種類型,從實現角度來看,迭代器是一種將operator* , operator-> , operator++,operator–等指針相關操作予以重載的class template. 所有
STL容器都附帶有自己專屬的迭代器,只有容器的設計者才知道如何遍歷自己的元素。原生指針(native pointer)也是一種迭代器。
仿函數
行為類似函數,可作為算法的某種策略。從實現角度來看,仿函數是一種重載了operator()的class 或者class template
適配器
一種用來修飾容器或者仿函數或迭代器接口的東西。
空間配置器
負責空間的配置與管理。從實現角度看,配置器是一個實現了動態空間配置、空間管理、空間釋放的class tempalte.
STL六大組件的交互關系,容器通過空間配置器取得數據存儲空間,算法通過迭代器存儲容器中的內容,仿函數可以協助算法完成不同的策略的變化,適配器可以修飾仿函數。
STL的優點很明顯了:
STL 是 C++的一部分,因此不用額外安裝什么,它被內建在你的編譯器之內。
STL 的一個重要特性是將數據和操作分離。數據由容器類別加以管理,操作則由可定制的算法定義。迭代器在兩者之間充當“粘合劑”,以使算法可以和容器交互運作
程序員可以不用思考 STL 具體的實現過程,只要能夠熟練使用 STL 就 OK 了。這樣他們就可以把精力放在程序開發的別的方面。
STL 具有高可重用性,高性能,高移植性,跨平台的優點。
高可重用性:STL 中幾乎所有的代碼都采用了模板類和模版函數的方式實現,這相比於傳統的由函數和類組成的庫來說提供了更好的代碼重用機會。
高性能:如 map 可以高效地從十萬條記錄里面查找出指定的記錄,因為 map 是采用紅黑樹的變體實現的。
高移植性:如在項目 A 上用 STL 編寫的模塊,可以直接移植到項目 B 上。
三大組件介紹
1. 容器
幾乎可以說,任何特定的數據結構都是為了實現某種特定的算法。STL容器就是將運用最廣泛的一些數據結構實現出來。
常用的數據結構:數組(array) , 鏈表(list), tree(樹),棧(stack), 隊列(queue), 集合(set),映射表(map), 根據數據在容器中的排列特性,這些數據分為序列式容器和關聯式容器兩
種。
序列式容器強調值的排序,序列式容器中的每個元素均有固定的位置,除非用刪除或插入的操作改變這個位置。Vector容器、Deque容器、List容器等。
關聯式容器是非線性的樹結構,更准確的說是二叉樹結構。各元素之間沒有嚴格的物理上的順序關系,也就是說元素在容器中並沒有保存元素置入容器時的邏輯順序。關聯式容器另一個顯著特點
是:在值中選擇一個值作為關鍵字key,這個關鍵字對值起到索引的作用,方便查找。Set/multiset容器 Map/multimap容器
2. 算法
算法,問題的解法,以有限的步驟,解決邏輯或數學上的問題。
我們所編寫的每個程序都是一個算法,其中的每個函數也都是一個算法,畢竟它們都是用來解決或大或小的邏輯問題或數學問題。STL收錄的算法經過了數學上的效能分析與證明,是極具復用價值
的,包括常用的排序,查找等等。特定的算法往往搭配特定的數據結構,算法與數據結構相輔相成。
算法分為:質變算法和非質變算法。
質變算法:是指運算過程中會更改區間內的元素的內容。例如拷貝,替換,刪除等等
非質變算法:是指運算過程中不會更改區間內的元素內容,例如查找、計數、遍歷、尋找極值等等
3. 迭代器
迭代器(iterator)是一種抽象的設計概念,現實程序語言中並沒有直接對應於這個概念的實物。 在<
下:提供一種方法,使之能夠依序尋訪某個容器所含的各個元素,而又無需暴露該容器的內部表示方式。
迭代器的設計思維-STL的關鍵所在,STL的中心思想在於將容器(container)和算法(algorithms)分開,彼此獨立設計,最后再一貼膠着劑將他們撮合在一起。
從技術角度來看,容器和算法的泛型化並不困難,c++的class template和function template可分別達到目標,如果設計出兩這個之間的良好的膠着劑,才是大難題。
迭代器的種類:
迭代器 | 功能 | 描述 |
---|---|---|
輸入迭代器 | 提供對數據的只讀訪問 | 只讀,支持++、==、!= |
輸出迭代器 | 提供對數據的只寫訪問 | 只寫,支持++ |
前向迭代器 | 提供讀寫操作,並能向前推進迭代器 | 讀寫,支持++、==、!= |
雙向迭代器 | 提供讀寫操作,並能向前和向后操作 | 讀寫,支持++、– 、==、!= |
隨機訪問迭代器 | 提供讀寫操作,並能以跳躍的方式訪問容器的任意數據,是功能最強的迭代器 | 讀寫,支持++、–、[n]、-n、<、<=、>、>= |