正如前面所提到的,在STL的背後蘊含着泛型化程序設計(GP)的思想,在這種思想裏,大部分基本算法被抽象,被泛化,獨立於與之對應的數據結構,用於以相同或相近的方式處理各類不一樣情形。這一思想和麪向對象的程序設計思想(OOP)不盡相同,由於,在OOP中更注重的是對數據的抽象,即所謂抽象數據類型(Abstract Data Type),而算法則一般被附屬於數據類型之中。幾乎全部的事情均可以被看做類或者對象(即類的實例),一般,咱們所看到的算法被做爲成員函數(member function)包含在類(class)中,類和類則構成了錯綜複雜的繼承體系。linux
儘管在象C++這樣的程序設計語言中,你還能夠用全局函數來表示算法,可是在相似於Java這樣的純面向對象的語言中,全局函數已經被"勒令禁止"了。所以,用Java來模擬GP思想是頗爲困難的。若是你對前述的STL歷史還有印象的話,應該記得Alexander Stepanove也曾用基於OOP的語言嘗試過實現GP思想,可是效果並很差,包括沒有引入模板以前的C++語言。站在巨人的肩膀上,咱們能夠得出這樣的結論,在OOP中所體現的思想與GP的思想確實是相異的。C++並非一種純面向對象的程序設計語言,它的絕妙之處,就在於既知足了OOP,又成全了GP。對於後者,模板立下了汗馬功勞。另外,須要指出的是,儘管GP和OOP有諸多不一樣,但這種不一樣還不至於到"水火不容"的地步。而且,在實際運用的時候,二者的結合使用每每可使問題的解決更爲有效。做爲GP思想實例的STL自己即是一個很好的範例,若是沒有繼承,不知道STL會是什麼樣子,彷佛沒有人作過這樣的試驗。web
相信你對STL的感性認識應該有所提升了,是該作一些實際的工做了,那麼咱們首先來了解一下STL的不一樣實現版本。ANSI/ISO C++文件中的STL是一個僅被描述在紙上的標準,對於諸多C++編譯器而言,須要有各自實際的STL,它們或多或少的實現了標準中所描述的內容,這樣纔可以爲咱們所用。之因此有不一樣的實現版本,則存在諸多緣由,有歷史的緣由,也有各自編譯器生產廠商的緣由。如下是幾個常見的STL實現版本。數據結構
HP STL是全部其它STL實現版本的根源。它是STL之父Alexander Stepanov在惠普的Palo Alto實驗室工做時,和Meng Lee共同完成的,是第一個STL的實現版本(參見1.2節)。這個STL是開放源碼的,因此它容許任何人無償使用、複製、修改、發佈和銷售該軟件和相關文檔,前提是必須在全部相關文件中加入HP STL的版本信息和受權信息。如今已經不多直接使用這個版本的STL了。性能
P. J. Plauger STL屬於我的做品,由P. J. Plauger本人實現,是HP STL的一個繼承版本,所以在其全部頭文件中都含有HP STL的相關聲明,同時還有P. J. Plauger本人的版權聲明。P. J. Plauger是標準C中stdio庫的早期實現者,如今是C/C++ User's Journal的主編,與Microsoft保持着良好的關係。P. J. Plauger STL即是被用於Microsoft的Visual C++中的。在Windows平臺下的同類版本中,其性能不錯,可是queue組件(隊列,一種容器)的效率不理想,同時因爲Visual C++對C++語言標準的支持不是很好(至少直到VC6.0爲止,仍是如此),所以必定程度上影響了P. J. Plauger STL的性能。此外,該版本的源代碼可讀性較差,你能夠在VC的Include子目錄下找到全部源文件(好比:C:\Program Files\Microsoft Visual Studio\VC98\Include)。由於不是開放源碼的(open source),因此這些源代碼是不能修改和銷售的,目前P.J. Plauger STL由Dinkumware公司提供相關服務,詳情請見http://www.dinkumware.comVisualStudiohashset容器。ui
Rouge Wave STL是由Rouge Wave公司實現的,也是HP STL的一個繼承版本,除了HP STL的相關聲明以外,還有Rouge Wave公司的版權聲明。同時,它也不是開放源碼的,所以沒法修改和銷售。該版本被Borland C++ Builder所採用,你能夠在C++ Builder的Include子目錄下找到全部頭文件(好比:C:\Program Files\Borland\Cbuilder5\Include)。儘管Rouge Wave STL的性能不是很好,但因爲C++ Builder對C++語言標準的支持還算不錯,使其表如今必定程度上得以改善。此外,其源代碼的可讀性較好。能夠從以下網站獲得更詳細的狀況介紹:http://www.rougewave.com源代碼C:Program Files\Borland\Cbuilder6\Include\oldstl)。
STLport最初源於俄國人Boris Fomitchev的一個開發項目,主要用於將SGI STL的基本代碼移植到其餘諸如C++Builder或者是Visual C++這樣的主流編譯器上。由於SGI STL屬於開放源碼,因此STLport纔有權這樣作。目前STLport的最新版本是4.5。能夠從以下網站獲得更詳細的狀況介紹:http://www.stlport.org免費下載VC中的STL要快。比Rouge Wave STL更符合標準,也更容易移植。Borland C++ Builder已經在其6.0版中加入了對STLport的支持,它使用的STLport就是4.5版的,C++ Builder 6.0同時還提供了STLport的使用說明。你能夠在C++ Builder的Include\Stlport子目錄下找到全部頭文件(好比:C:\Program Files\Borland\Cbuilder6\Include\Stlport)。
SGI STL是由Silicon Graphics Computer System, Inc公司實現的,其設計者和編寫者包括Alexander Stepanov和Matt Austern,一樣它也是HP STL的一個繼承版本。它屬於開放源碼,所以你能夠修改和銷售它。SGI STL被GCC(linux下的C++編譯器)所採用,你能夠在GCC的Include子目錄下找到全部頭文件(好比:C:\cygnus\cygwin-b20\include\g++\include)。因爲GCC對C++語言標準的支持很好,SGI STL在linux平臺上的性能至關出色。此外,其源代碼的可讀性也很好。能夠從以下網站獲得更詳細的狀況介紹:http://www.sgi.com新版本是3.3。
圖2:STL家族的譜系