泛型編程

泛型編程讓你編寫完全一般化並可重複使用的算法,其效率與針對某特定數據類型而設計的算法相同。泛型編程的代表作品STL是一種高效、泛型、可交互操作的軟件組件。所謂泛型(Genericity),是指具有在多種數據類型上皆可操作的含意,與模板有些相似。STL巨大,而且可以擴充,它包含很多計算機基本算法和數據結構,而且將算法與數據結構完全分離,其中算法是泛型的,不與任何特定數據結構或對象類型系在一起。STL以迭代器 (Iterators)和容器(Containers)爲基礎,是一種泛型算法(Generic Algorithms)庫,容器的存在使這些算法有東西可以操作。STL包含各種泛型算法(algorithms)、泛型指針(iterators)、泛型容器(containers)以及函數對象(function objects)。STL並非只是一些有用組件的集合,它是描述軟件組件抽象需求條件的一個正規而有條理的架構。

  泛型的第一個好處是編譯時的嚴格類型檢查。這是集合框架最重要的特點。此外,泛型消除了絕大多數的類型轉換。如果沒有泛型,當你使用集合框架時,你不得不進行類型轉換。

  關於泛型的理解可以總結下面的一句話,它是把數據類型作爲一種參數傳遞進來。

 

 

 

泛型編程(generic programming通用編程/類屬編程)和麪向過程以及面向對象一起,是混合型程序設計語言C++所包含的三種編程風範(paradigm範例/範型)。

傳統C++的泛型編程,僅僅侷限於簡單的模版技術。標準C++新引入了容器(container)、迭代器(iterator)、分配器(allocator)和STL(Standard Template Library標準模板庫)等概念和內容,才真正進入泛型編程的廣闊天地。

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

如果需要編寫一個可用於不同數據類型的算法,可以採用的方法有:

<!--[if !supportLists]-->l     <!--[endif]-->面向過程——對源代碼進行復制和修改,生成不同數據類型版本的算法函數,調用時需要對數據類型進行手工的判斷;

<!--[if !supportLists]-->l     <!--[endif]-->面向對象——可以在一個類中,編寫多個同名函數,它們的算法一致,但是所處理數據的類型不同,當然函數的輸入參數類型也不同,可通過函數重載來自動調用對應數據類型版本的函數。

顯然,這兩種方法都需編寫了多個相同算法的不同函數,不能做到代碼重用。它們二者之間的主要差別,只是調用的方便與否。

如果採用泛型編程(例如可採用以類型作爲參數的傳統C++的模板技術),就可以做到源代碼級的重用:

<!--[if !supportLists]-->l     <!--[endif]-->泛型編程——編寫以類型作爲參數的一個模板函數,在調用時再將參數實例化爲具體的數據類型。

(注意,模版的實例化,是在編譯階段完成的,屬於靜態性質的方法,與C/C++的宏替代方式非常相似,但是更爲安全、更易理解、且更加有效。)

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

2)泛型編程與STL
泛型編程是一種面向算法的多態技術,STL是它的一種具體實現。

(1)泛型編程
在計算機科學中,泛型(generic)是一種允許一個值取不同數據類型(所謂多態)的技術,強調使用這種技術的編程風格被稱爲泛型編程(generic programming通用編程/類屬編程)。

泛型編程研究對軟件組件的系統化組織。目標是推出一種針對算法、數據結構和內存分配機制的分類方法,以及其他能夠帶來高度可重用性、模塊化和可用性的軟件工具。

與針對問題和數據的面向對象的方法不同,泛型編程中強調的是算法。是一類通用的參數化算法,它們對各種數據類型和各種數據結構都能以相同的方式進行工作,從而實現源代碼級的軟件重用。

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

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

(2)STL
STL(Standard Template Library標準模板庫)是泛型編程思想的實際體現和具體實現,它是一種爲泛型組件建立大型標準庫的可擴展架構。STL本身,與面向對象無關,也與具體的程序設計語言無關。

STL的目標是,在不損失效率的基礎上,進行抽象。這裏的不損失效率,是指盡最大努力來保證其所有的泛型算法是最優的,並且和手工編碼具有同樣的運行效率。抽象的基礎是數學和馮·諾依曼計算模型(存儲程序體系結構)。

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

STL將容器看作是結構的泛化,它們都擁有成員,可以描述整體和局部這一現實世界事物的關鍵屬性。STL使用了賦值的算法,要求採用面向值的語義。STL還假定對容器中的數據和對象,定義了全序。

STL的主要內容是6種組件:容器、泛型算法、迭代器、函數對象、分配器和適配器等。在標準C++中,STL是作爲C++標準庫的一部分而出現的。

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