泛型與STL

    面向過程、面向對象、泛型編程(Generic Programming,簡稱GP)應該是三種重用的編程方法。傳統的C++語言中,泛型編程思想僅僅體現於簡單的模板技術。而之後引入的標準模板庫 STL(Standard Template Library)是泛型編程思想的實際體現和具體實現。

1. 問題引入

    面向過程的方法,可以將常用代碼段封裝在一個函數中,然後通過函數調用來達到目標代碼重用的目的。
    面向對象的方法,可以通過類的繼承來實現(對象的目標)代碼的重用。

    如果需要編寫一個可用於不同數據類型的算法,可以採用的方法有:
    1). 面向過程的方法,對源代碼進行復制和修改,生成不同數據類型版本的算法函數,調用時需要對數據類型進行手工的判斷;
    2). 面向對象的方法,在一個類中,編寫多個同名函數,它們的算法一致,但是所處理數據的類型不同,當然函數的輸入參數類型也不同,過函數重載來自動調用對應數據類型版本的函數。

     顯然, 以上兩種方法都需編寫多個相同算法的不同函數,不能做到代碼重用。它們二者之間的主要差別,只是調用的方便與否。如果採用泛型編程(例如可採用以類型作爲參數的傳統C++的模板技術),就可以做到源代碼級的重用:

     泛型編程方法,編寫以類型作爲參數的一個模板函數,在調用時再將參數實例化爲具體的數據類型。爲了實現一個這樣的算法,在具有不同組織結構(如數組、鏈 表、隊列、堆棧等)、含同一類型(如char、int、float、struct S或class C等)的數據或對象的集合(容器)上的,與具體數據類型無關的參數化通用算法(如排序、檢索、複製、合併等)。只有模版是遠遠不夠的,還需要能夠表示這種 集合的容器、能夠在容器中遍歷的迭代器、能夠爲算法和容器實現抽象存儲的分配器、能夠在不同容器之間進行轉換的適配器等等。這些正是泛型編程的研究內容, 也是STL要實現的目標。

2. 泛型編程

     泛型(generic)是一種允許一個值取不同數據類型的技術, 而基於此發高效的最抽象表示的編程方法被稱爲泛型編程(Generic Programming,通用編程/類屬編程)。

     泛型編程關注於產生通用的軟件組件,讓這些組件在不同的應用場合都能很容易地重用。在C++中,類模板和函數模板是進行泛型編程極爲有效的機制. 與針對問題和數據的面向對象的方法不同,泛型編程中強調的是算法,是一類通用的參數化算法,它們對各種數據類型和各種數據結構都能以相同的方式進行工作, 從而實現源代碼級的軟件重用。

     例如,不管(容器)是數組、隊列、鏈表、還是堆棧,不管裏面的元素(類型)是字符、整數、浮點數、還是對象,都可以使用同樣的(迭代器)方法來遍歷容器內的所有元素、獲取指定元素的值、添加或刪除元素,從而實現排序、檢索、複製、合併等各種操作和算法。

     泛型編程的通用化算法,是建立在各種抽象化基礎之上的:利用參數化模版來達到數據類型的抽象化、利用容器和迭代器來達到數據結構的抽象化、利用分配器和適配器來達到存儲分配和界面接口的抽象化。

3. STL

      STL(Standard Template Library,標準模板庫)是泛型編程思想的實際體現和具體實現,它是一種爲泛型組件建立大型標準庫的可擴展架構。STL本身,與面向對象無關,也與具 體的程序設計語言無關。 STL的目標是在不損失效率的基礎上進行抽象。這裏的不損失效率,是指盡最大努力來保證其所有的泛型算法是最優的,並且和手工編碼具有同樣的運行效率。

      如果用數學語言來描述,STL的本質就是:不同的數據結構,對應於不同的地址代數結構、以及不同的地址連接方式。從數據結構的一個地址,轉向下一個地址的一些列操作,就對應於迭代器。在數據結構中添加和刪除地址的操作,就對應於容器。

      STL將容器看作是結構的泛化,它們都擁有成員,可以描述整體和局部這一現實世界事物的關鍵屬性。STL使用了賦值的算法,要求採用面向值的語義。STL 還假定對容器中的數據和對象,定義了全序。 STL的主要內容是6種組件:容器、泛型算法、迭代器、函數對象、分配器和適配器等。在標準C++中,STL是作爲C++標準庫的一部分而出現的。

轉自:http://www.cnblogs.com/alex-tech/archive/2011/03/27/1996802.html

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