美妙的STL

STL,英文全稱 standard template library,中文可譯爲標準模板庫或者泛型庫,是C++標準庫的重要組成部分,其包含有大量的模板類和模板函數,是 C++ 提供的一個基礎模板的集合,用於完成諸如輸入/輸出、數學計算等功能。

STL 最初由惠普實驗室開發,於 1998 年被定爲國際標準,正式成爲 C++ 程序庫的重要組成部分。值得一提的是,如今 STL 已完全被內置到支持 C++ 的編譯器中,無需額外安裝,這可能也是 STL 被廣泛使用的原因之一。

STL 就位於各個 C++ 的頭文件中,即它並非以二進制代碼的形式提供,而是以源代碼的形式提供。

從根本上說,STL 是一些容器、算法和其他一些組件的集合,所有容器和算法都是總結了幾十年來算法和數據結構的研究成果,彙集了許多計算機專家學者經驗的基礎上實現的,因此可以說,STL 基本上達到了各種存儲方法和相關算法的高度優化。

注意,這裏提到的容器,本質上就是封裝有數據結構的模板類,例如 list、vector、set、map 等。

STL組成框架
STL
網上有句話說:“不懂STL,不要說你會C++”。STL是C++中的優秀作品,有了它的陪伴,許多底層的數據結構以及算法都不需要自己重新造輪子,站在前人的肩膀上,健步如飛的快速開發。

STL版本

自 1998 年 ANSI/ISO C++ 標準正式定案,C++ STL 規範版本正式通過以後,由於其實開源的,各個 C++ 編譯器廠商在此標準的基礎上,實現了滿足自己需求的 C++ STL 泛型庫,主要包括 HP STL、SGI STL、STLport、PJ STL、Rouge Wave STL 等。

HP STL
HP STL 是 Alexandar Stepanov(STL 標準模板庫之父,文章後續簡稱 Stepanov)在惠普 Palo Alto 實驗室工作時,與 Meng Lee 合作完成的。HP STL 是開放源碼的,即任何人都可以免費使用、複製、修改、發佈和銷售該軟件以及相關文檔,但前提是必須在相關文檔中,加入 HP STL 版本信息和授權信息。

HP STL 是 C++ STL 的第一個實現版本,其它版本的 C++ STL 一般是以 HP STL 爲藍本實現出來的。不過,現在已經很少直接使用此版本的 STL 了。

SGI STL
Stepanov 在離開 HP 之後,就加入到了 SGI 公司,並和 Matt Austern 等人開發了 SGI STL。嚴格意義上來說,它是 HP STL 的一個繼承版本。和 HP STL 一樣,SGI STL 也是開源的,其源代碼的可讀性可非常好,並且任何人都可以修改和銷售它。

注意,和 STL 官方版本來說,SGI STL 只能算是一個“民間”版本,因此並不是所有支持 C++ 的編譯器都支持使用 SGI STL 模板庫,唯一能確定的是,GCC(Linux 下的 C++ 編譯器)是支持的,所以 SGI STL 在 Linux 平臺上的性能非常出色。

STLport
爲了使 SGI STL 的基本代碼都適用於 VC++ 和 C++ Builder 等多種編譯器,俄國人 Boris Fomitchev 建立了一個 free 項目來開發 STLport,此版本 STL 是開放源碼的。

PJ STL
PJ STL(全稱爲 P.J. Plauger STL)是由 P.J.Plauger(美國人,1965 年畢業於普林斯頓大學,物理專業學士)參照 HP STL 實現出來的,也是 HP STL 的一個繼承版本,因此該頭文件中不僅含有 HP STL 的相關授權信息,同時還有 P.J.Plauger 本人的版權信息。

其實 PJ STL 是 P.J.Plauger 公司的產品,儘管該公司當時只有 3 個人。

PJ STL 被 Visual C++ 編譯器所採用,但和 PH STL、SGI STL 不同的是,PJ STL 並不是開源。

Rouge Wave STL
該版本的 STL 是由 Rouge Wave 公司開發的,也是繼承 HP STL 的一個版本,它也不是開源的。

Rouge Wave STL 用於 Borland C++ Builder 編譯器中,我們可以在 C++ Builder 的 Inculde 子目錄中找到該 STL 的所有頭文件。

值得一提的是,儘管 Rouge Wave STL 的性能不是很好,但 C++ Builder 對 C++ 語言標準的支持還算不錯,所以在一定程度上使 Rouge Wave STL 的表現得以改善。

遺憾的是,由於 Rouge Wave STL 長期沒有更新且不完全符合標準,因此 Rouge Wave STL 在 6.0 版本時改用了 STLport 版本(之後的版本也都採用了 STLport),不過考慮到和之前版本的兼容,6.0 版本中依舊保留了 Rouge Wave STL。

Rouge Wave 公司在 C++ 程序庫領域應該說是鼎鼎大名,對 C++ 標準化的過程出力甚多。不過 Rouge Wave STL 版本不僅更新頻率慢,費用還高,基於這兩個原因,Borland 在 6.0 版本決定棄用 Rouge Wave STL 而改用 STLport。

在實際的學習和應用中,我們一般使用的是SGI STL。

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