STL原始碼分析:泛型程式設計與STL
定義抽象的concepts,並根據抽象的concepts來撰寫演算法與資料結構,是泛型程式設計的本質。
運用STL時的幾個最重要的觀念:
1.所謂使用STL,就是去擴充它。
2.STL的演算法和容器是獨立分離的。
3.無須繼承。
4.抽象化並不意味效率低。
STL所實現的,是依據泛型思維架設起來的一個概念結構。這個以抽象概念為主體而非以實際類為主體的結構,形成了一個嚴謹的介面標準。在此介面下,任何元件都有最大的獨立性,並以所謂迭代器膠合起來,或以所謂配接器互相配接,或以所謂仿函式動態選擇某種策略。
六大元件互動關係
Container通過Allocator取得資料儲存空間,Algorithm通過Iterator存取Container內容,Functor可以協助Algorithm完成不同的策略變化,Adapter可以修飾或套接Functor。
Iterator
Iterator可說是STL最重要的一個創新發明,它使"將演算法與其相關資料結構的關係切割分離“一事變得可能。
何為Concept?
如果Concept既非class,也非function或template,那麼它是什麼?有三種方式可以瞭解Concepts,這些方式一開始似乎大不相同,但是最後證明都是相通的。這三種方式有助於瞭解泛型 演算法的一些重要觀點。
第一,Concept可以想象是一組型別條件。如果說型別T是Concept C的一個model,則T必 須滿足C的所有條件。描述某個型別所必須具備的性質幾乎是最容易具體指明Concept的方式了。
第二,Concept可以想成是型別的集合。舉例來說,Concept input iterator可涵蓋char*、int*、node* 等型別。如果型別T是Concept C 的model,意思便是說T隸屬於C所代表的那個型別集合。由於集合中的所有型別都滿足那一系列條件,其實是以不同的角度看待同一件事情。
第三,Concept可以想象成是一組合法程式。依次定義,那麼像input iterator這樣的Concept,其 重要性在於find以及其他許多演算法都會用到它。這個Concept自身包含iterator及那些演算法共有的 性質。這種定義似乎比前兩者更加抽象,但是卻很重要,因為就某種意義來說,這是三中方法中 最實用的。這也是新的概念的發掘方法。是的,我們並非藉由寫下一組需求條件來發掘和描述新 的概念,而是藉由定義特別的演算法並研究模板引數如何運行於這些演算法身上的過程來完成。我們 研究find,過程中匯出了 input iterator。本書其他各種概念同樣是肇因與演算法。
Iterator是指標的概括物,它們是”用來指向其他物件“的一種物件。
Iterator對於泛型程式設計之所以重要,原因是它是演算法與資料結構之間的介面。
1、Input Iterator :只允許作為輸入,也就是隻讀(Read Only)
2、Output Iterator :只允許作為輸出,也就是隻寫(Write Only)
3、Forward Iterator :允許讀寫,但只能做前向移動
4、Bidirectional Iterator :允許讀寫,可以做雙向移動
5、Random Access Iterator :允許讀寫,可以任意移動,可作(P+N和P-N)、(P[n])、(P1-P2)、(P1 < P2)
Function objects
Function objects是非常一般化的概念,它們可以將任何種類的行為引數化。幾乎任何演算法都能以“將其行為的某一部分抽象化為function object”的方式來加以一般化。Containers
STL預定義的所有container classes都是一種Forward Container,其中大多數甚至是Bidirectional Container。有一些像block之類的container classes,則屬於Random Access Container。
Allocators
很多containers以動態方式分配記憶體(但非全部如此,例如block就不是)。配置器,它代表一種特定記憶體模型,並提供一種抽象概念,以便將對記憶體的申請最終轉變為對記憶體的直接呼叫。
STL提供了很多泛型容器,如vector,list和map。程式設計師在使用這些容器時只需關心何時往容器內塞物件,而不用關心如何管理記憶體,需要用多少記憶體,這些STL容器極大地方便了C++程式的編寫。
Algorithms
各種常用演算法,如sort,search,copy,erase。從實現的角度講,STL演算法是一種function template。
Adapters
一種用來修飾容器或仿函式或迭代器介面的東西。
改變functor介面者,稱為function adapter;改變contrainer介面者,稱為contrainer adapter;改變iterator介面者,稱為iterator adapter。參考:《STL原始碼剖析》