電子商務(wù)的就業(yè)方向seo網(wǎng)站優(yōu)化是什么
目錄
一、什么是 STL?
二、STL 的版本
三、STL 的 6 大組件和 13 個頭文件
四、學(xué)習(xí) STL 的 3 個境界
五、STL 的缺陷
參考資料:
STL教程:C++ STL快速入門(非常詳細(xì)) (biancheng.net)。
C++ STL是什么,有什么用? (biancheng.net)。
C++ STL版本有哪些? (biancheng.net)。
C++ STL基本組成(6大組件+13個頭文件) (biancheng.net)。 ?
?
一、什么是 STL?
STL 是 "Standard Template Library" 的縮寫,中文可譯為 "標(biāo)準(zhǔn)模板庫" 或者 "泛型庫",其包含有大量的類模板和函數(shù)模板,是 C++ 提供的一個基礎(chǔ)模板的集合。
STL 最初由惠普實驗室開發(fā),于 1998 年被認(rèn)定為國際標(biāo)準(zhǔn),正式成為 C++標(biāo)準(zhǔn)庫的重要組成部分。
值得一提的是,如今 STL 已完全被內(nèi)置到支持 C++ 的編譯器中,無需額外安裝,這可能也是 STL 被廣泛使用的原因之一。
STL 就位于各個 C++ 的頭文件中,即它并非以二進(jìn)制代碼的形式提供,而是以源代碼的形式提供。
從根本上來說,STL 是一些容器、算法和其他一些組件的集合,所有容器和算法都是總結(jié)了十幾年來算法和數(shù)據(jù)結(jié)構(gòu)的研究成果,匯集了許多計算機專家經(jīng)驗的基礎(chǔ)上實現(xiàn)的,因此可以說,STL 基本上達(dá)到了各種存儲方法和相關(guān)算法的高度優(yōu)化。
注意,這里提到的容器,本質(zhì)上就是封裝有數(shù)據(jù)結(jié)構(gòu)的類模板,例如 list、vector、set、map 等。
二、STL 的版本
自 1998 年 ANSI/ISO C++ 標(biāo)準(zhǔn)正式定案,C++ STL 規(guī)范版本正式通過以后,由于其是開源的,各個 C++ 編譯器廠商在此標(biāo)準(zhǔn)的基礎(chǔ)上,實現(xiàn)了滿足自己需求的 C++ STL 泛型庫,主要包括:
-
HP STL
HP STL 是 Alexandar Stepanov(STL 標(biāo)準(zhǔn)模板庫之父)在惠普 Palo Alto 實驗室工作時,與 Meng Lee 合作完成的。HP STL 是開放源碼的,即任何人都可以免費使用、復(fù)制、修改、發(fā)布和銷售該軟件以及相關(guān)文檔,但前提是必須在相關(guān)文檔中,加入 HP STL 版本信息和授權(quán)信息。
HP STL 是 C++ STL 的第一個實現(xiàn)版本,其他版本的 C++ STL 一般是以 HP STL 為藍(lán)本實現(xiàn)出來的。不過,現(xiàn)在已經(jīng)很少直接使用此版本的 STL 了。
-
SGI STL
Stepanov 在離開 HP 之后,就加入到了 SGI 公司,并和 Matt Austern 等人共同開放了 SGI STL。嚴(yán)格意義上來說,它是 HP STL 的一個繼承版本。和 HP STL 一樣,SGI STL 也是開源的,其源代碼的可讀性非常好,并且任何人都可以修改和銷售它。
注意,SGI STL 只能算是一個 "民間" 版本,因此并不是所有支持 C++ 的編譯器都支持 SGI STL,唯一能確定的是,GCC(Linux 下的 C++ 編譯器)是支持的,所以 SGI STL 在 Linux 平臺上的性能非常出色。
-
STLport
為了使 SGI STL 的基本代碼適用于 VC++ 和 C++ Builder 等多種編譯器,俄國人 Boris Fomitchev 建立了一個 free 項目來開發(fā) STLport,此版本 STL 是開放源代碼的。
-
PJ STL
PJ STL(全稱 P.J Plauger STL)是由 P.J.Plauger(美國人,1965 年畢業(yè)于普林斯頓大學(xué),物理學(xué)專業(yè)學(xué)士)參照 HP STL 實現(xiàn)出來的,也是 HP STL 的一個繼承版本,因此該頭文件不僅包含 HP STL 的相關(guān)授權(quán)信息,同時還有 P.J.Plauger 本人的授權(quán)信息。
其實 PJ STL 是 P.J.Plauger 公司的產(chǎn)品,盡管該公司當(dāng)時只有 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 的 Include 子目錄中找到該 STL 的所有頭文件。
值得一提的是,盡管 Rouge Wave STL 的性能不是很好,但 C++ Builder 對 C++ 語言標(biāo)準(zhǔn)的支持還算不錯,所以一定程度上使 Rouge Wave STL 的表現(xiàn)得以改善。
遺憾的是,由于 Rouge Wave STL 長期沒有更新且不完全符合標(biāo)準(zhǔn),因此 Rouge Wave STL 在 6.0 版本時改用 STLport 版本(之后的版本也都采用了 STLport),不過考慮到和之前版本的兼容,6.0 版本中依舊保留了 Rouge Wave STL。
Rouge Wave 公司在 C++ 程序庫領(lǐng)域應(yīng)該說是大名鼎鼎,對 C++ 標(biāo)準(zhǔn)化的過程出力甚多。不過 Rouge Wave STL 版本不僅更新頻率慢,費用還高,基于這兩個原因,Borland 在 6.0 版本決定奇用 Rouge Wave STL 而改用 STLport。
三、STL 的 6 大組件和 13 個頭文件
通常認(rèn)為,STL 是由容器、算法、迭代器、函數(shù)對象、適配器、內(nèi)存分配器這 6 個部分構(gòu)成,其中后面 4 個部分是為前面 2 個部分服務(wù)的,它們各自的含義如下表所示:
STL 的組成部分 | 含義 |
---|---|
容器(Containers) | 一些封裝數(shù)據(jù)結(jié)構(gòu)的類模板,例如 vector 向量容器、list 列表容器等 |
算法(Algorithms) | STL 提供了非常多(大約 100 個)的數(shù)據(jù)結(jié)構(gòu)算法,它們都被設(shè)計成一個個的函數(shù)模板,這些算法在 std 命名空間中定義,其中大部分算法都包含在頭文件 <algorithm> 中,少部分位于頭文件 <numeric> 中 |
迭代器(Iterators) | 在 C++ STL 中,對容器中數(shù)據(jù)的讀和寫,是通過迭代器完成的,扮演著容器和算法之間的膠合劑 |
函數(shù)對象(Functors) | 如果一個類將 () 運算符重載為成員函數(shù),這個類就稱為函數(shù)對象類,這個類的對象就是函數(shù)對象(又稱仿函數(shù)) |
適配器(Adapters) | 可以使一個類的接口(模板的參數(shù))適配成用戶指定的形式,從而讓原本不能在一起工作的兩個類工作在一起。值得一提的是,容器、迭代器和函數(shù)都有適配器。 |
內(nèi)存分配器(Allocators) | 為容器類模板提供自定義的內(nèi)存申請和釋放功能,由于往往只有高級用戶才有改變內(nèi)存分配策略的需求,因此內(nèi)存分配器對于一般用戶來說,并不常用。 |
另外,在惠普實驗室最初發(fā)行的版本中,STL 被組織成 48 個頭文件;但在 C++ 標(biāo)準(zhǔn)中,它們被重新組織為 13 個頭文件:
<iteraotr> ?<functional> ?<vector> ?<deque>
<list> ?<queue> ?<stack> ?<set>
<map> ?<algorithm> ?<numeric> ?<memory>
<utility>
按照 C++ 標(biāo)準(zhǔn)庫的規(guī)定,所有標(biāo)準(zhǔn)頭文件都不再有擴展名。以 <vector> 為例,此為無擴展名的形式,而 <vector.h> 為有擴展名的形式。
但是,或許為了向下兼容,或許是為了內(nèi)部組織規(guī)劃,某些 STL 版本同時存儲具備擴展名和無擴展名的兩份文件(例如 Visual C++ 支持的 Dinkumware 版本同時具備 <vector> 和 <vector.h>);甚至有些 STL 版本同時具有 3 種形式的頭文件(例如 SGI 版本同時擁有 <vector>、<vector.h> 和 <stl_vector.h>);但也有個別的 STL 版本只存在包含擴展名的頭文件(例如 C++ Builder 的 Rauge Ware 版本只有 <vector.h>)。
建議讀者養(yǎng)成良好的習(xí)慣,遵照 C++ 規(guī)范,使用無擴展名的頭文件。
四、學(xué)習(xí) STL 的 3 個境界
簡單總結(jié)一下,學(xué)習(xí) STL 的 3 個境界分別為:能用、明理、能擴展。
五、STL 的缺陷
-
STL 庫的更新太慢了。上一版靠譜的是 C++98,中間的 C++03 基本是一些修訂,C++11 出來已經(jīng)相隔 13 年了,STL 才進(jìn)一步更新。
-
STL 現(xiàn)在都沒有支持線程安全。并發(fā)環(huán)境下需要我們自己加鎖,且鎖的粒度是比較大的。
-
STL 極度地追求效率,導(dǎo)致內(nèi)部比較復(fù)雜,比如類型萃取、迭代器萃取。
-
STL 的使用會有代碼膨脹的問題,當(dāng)然這是模板語法本身導(dǎo)致的。