# [37] 類庫
## FAQs in section [37]:
* [37.1] 什么是“STL”?
* [37.2] 哪里可以得到“STL”的拷貝?
* [37.3] 如何才能在Fred*的STL容器比如std::vector<Fred*>中找到Fred對象?
* [37.4] 哪里可以得到如何使用STL的幫助?
* [37.5] 如何判斷你是否有一個動態類型的C++類庫?
* [37.6] 什么是NIHCL?哪里可以得到它?
* [37.7] 哪里的FTP下載到《數值分析》附屬的代碼?
* [37.8] 為什么可執行文件這么大?
* [37.9] 哪里可以得到更多的有關C++類庫的信息?
## 37.1 什么是“STL”?
STL的(“標準模板庫”)是一個庫,主要包括( 非常高效)容器類,以及用于容器的迭代器和算法。
技術上來說,“STL”術語不再具有任何意義,因為它所提供的STL類以及其他標準類比如std::ostream等已被完全合并到標準庫,但許多人仍然使用STL這個術語,聽起來像它是一個獨立的東西,所以你不妨習慣于這種說法。
## 37.2 哪里可以得到“STL”的拷貝?
由于一部分STL類已經是標準類庫的一部分,你的編譯器應該提供這些類。如果你的編譯器不包括這些標準類,要么得到一個更新版本的編譯器或下載下列任何一個STL類的拷貝:
* An STL site: [`ftp.cs.rpi.edu/pub/stl`](ftp://ftp.cs.rpi.edu/pub/stl "ftp.cs.rpi.edu/pub/stl")
* STL HP official site: [`butler.hpl.hp.com/stl/`](ftp://butler.hpl.hp.com/stl/ "butler.hpl.hp.com/stl/")
* Mirror site in Europe: [`www.maths.warwick.ac.uk/ftp/mirrors/c++/stl/`](http://www.maths.warwick.ac.uk/ftp/mirrors/c++/stl/ "www.maths.warwick.ac.uk/ftp/mirrors/c++/stl/")
* STL code alternate: [`ftp.cs.rpi.edu/stl`](ftp://ftp.cs.rpi.edu/stl "ftp.cs.rpi.edu/stl")
* The SGI implementation: [`www.sgi.com/tech/stl/`](http://www.sgi.com/tech/stl/ "www.sgi.com/tech/stl/")
* STLport: [`www.stlport.org`](http://www.stlport.org "www.stlport.org")
用于GCC - 2.6.3的STL hacks是GNU libg + + 2.6.2.1或更高版本包的一部分(也可能會在較早版本)。感謝Mike Lindner。
另外,一些人使用“STL”來包括標準字符串頭文件`<string>`,但是其他人反對這一用法。
## 37.3 如何才能在`Fred*`的STL容器比如`std::vector<Fred*>`中找到`Fred`對象?
如`std::find_f()`這樣的STL函數可以幫助你找到容器內的 `T`號元素。但是,如果容器存儲的是指針,比如`std::vector<Fred*>`,這些函數將找到一個匹配`Fred*`的元素,但不能找到和`Fred`匹配的元素。
解決辦法是使用一個可選的參數,指定了“匹配”功能。下面的類模板可以間接地讓你比較指針所指向的對象。
```
?template<typename?T>
?class?DereferencedEqual?{
?public:
???DereferencedEqual(const?T*?p)?:?p_(p)?{?}
???bool?operator()?(const?T*?p2)?const?{?return?*p_?==?*p2;?}
?private:
???const?T*?p_;
?};
```
現在你可以使用此模板來找到適合的Fred對象:
```
?void?userCode(std::vector<Fred*>?v,?const?Fred&?match)
?{
???std::find_if(v.begin(),?v.end(),?DereferencedEqual<Fred>(&match));
...
?}
```
## 37.4 哪里可以得到如何使用STL的幫助?
這里有一些資源(排名不分先后):
Rogue Wave's STL Guide: [`www.ccd.bnl.gov/bcf/cluster/pgi/pgC++_lib/stdlibug/ug1.htm`](http://www.ccd.bnl.gov/bcf/cluster/pgi/pgC++_lib/stdlibug/ug1.htm "www.ccd.bnl.gov/bcf/cluster/pgi/pgC++_lib/stdlibug/ug1.htm")
The STL FAQ: [`butler.hpl.hp.com/stl/stl.faq`](ftp://butler.hpl.hp.com/stl/stl.faq "butler.hpl.hp.com/stl/stl.faq")
Kenny Zalewski's STL guide: [`www.cs.rpi.edu/projects/STL/htdocs/stl.html`](http://www.cs.rpi.edu/projects/STL/htdocs/stl.html "www.cs.rpi.edu/projects/STL/htdocs/stl.html")
Mumit's STL Newbie's guide: [`www.xraylith.wisc.edu/~khan/software/stl/STL.newbie.html`](http://www.xraylith.wisc.edu/~khan/software/stl/STL.newbie.html "www.xraylith.wisc.edu/~khan/software/stl/STL.newbie.html")
SGI's STL Programmer's guide: [`www.sgi.com/tech/stl/`](http://www.sgi.com/tech/stl/ "www.sgi.com/tech/stl/")
還有一些有益的書籍。
## 37.5 如何判斷你是否有一個動態類型的C++類庫?
* 提示#1:所有東西都派生自一個根類,通常是`object` 。
* 提示#2:容器類( 列表 , 堆棧 , 集等)是非模板。
* 提示#3:容器類( 列表 , 堆棧 , 集等)插入/提取的是對象指針。你可以放入`apple`到容器中,但是當你提取的時候,編譯器只知道它派生自`object` ,所以你必須使用指針轉換將其轉換回`apple*`;你更好祈禱這的對象就是一個`apple`對象,你需要自己對自己負責。
你可以使用使用`dynamic_cast`來保證類型安全,但 它能做的也僅僅發生在運行時。這種編碼風格是C++動態類型的精華。你調用一個函數,告訴該函數:“轉換`object`對象為`apple`對象,要么或返回`NULL` ,如果它不是`apple`類型”。不到運行時,你不知道會發生什么事。
當你使用模板來實現容器時,C++編譯器可以靜態驗證90+%的應用程序的類型信息(“90 +%”是不對的,有些人聲稱應該是100%,需要持久化(persistence)的人得不到100%),我想要強調的是:C++泛型特性是從模板獲得的,而不是繼承。
## 37.6 什么是NIHCL?哪里可以得到它?
NIHCL是“國家衛生局類庫”的簡寫,你可以從這里取得: [`128.231.128.7/pub/NIHCL/nihcl-3.0.tar.Z`](ftp://128.231.128.7/pub/NIHCL/nihcl-3.0.tar.Z "128.231.128.7/pub/NIHCL/nihcl-3.0.tar.Z")
NIHCL (有人讀作"N-I-H-C-L," 其他人讀作"nickel") 是Smalltalk類庫的C++版本。NIHCL的動態類型可以應用在一些方面(比如:對象持久化)。但是有些地方,NIHCL的用法和C++語言的靜態類型有沖突。
## 37.7 哪里的FTP下載到《數值分析》附屬的代碼?
此軟件是商業軟件,因此通過網絡渠道獲得是非法的。然而,只有30元左右。
## 37.8 為什么可執行文件這么大?
許多人驚訝可執行文件怎么這么大,特別是在源代碼很少的情況下。例如,一個簡單的“Hello World”程序肯能生成一個大于大多數人預計(40 + K字節)的可執行文件。
可執行文件的一個原因是部分的C++運行時庫會被靜態鏈接到應用程序。到底有多少被靜態鏈接,取決于是否靜態或動態鏈接標準庫的編譯器選項,也取決于你對標準庫的使用量,以及實現代碼會怎么分開庫代碼。例如,`<iostream>`庫非常大,包含有許多類和虛函數。對它的任何調用將會導致引入`<iostream>`的所有代碼(但可能有的編譯器選項,可以動態鏈接這些類庫,在這種情況下你的程序可能較小)。
另一個可執行文件大的原因可能是如果你打開了調試功能(當然還是通過編譯器選項)。如果是知名的編譯器,這個選項可能會增加可執行文件的大小到10倍。
你需要查看編譯器說明書或咨詢供應商的技術支持來獲得更詳細的解答。
## 37.9 哪里可以得到更多的有關C++類庫的信息?
你應該檢查三個地方(順序無關):
* C++庫常見問題,由 [Nikki Locke](mailto:(NOSPAM)cpplibs(AT)trmphrst(DOT)demon(DOT)co(DOT)uk "(NOSPAM)cpplibs(AT)trmphrst(DOT)demon(DOT)co(DOT)uk")維護,可以從[框架網頁](http://www.trumphurst.com/cpplibs/cpplibs.phtml)和[無框架網頁](http://www.trumphurst.com/cpplibs/cpplibs.phtml)得到。
* 你也應該檢查[`www.mathtools.net/C_C__/`](http://www.mathtools.net/C_C__/ "www.mathtools.net/C_C__/").他們有成堆的好東西,分門別類為60(目前)多個大類。
* 你也應該檢查[`www.boost.org/`](http://www.boost.org/ "www.boost.org/").他們有一些好東西,其中一些下一次可能得到標準化的提議。
重要:這些清單可能有遺漏。如果你正在尋找一些特定的上面沒有的功能,可以試試如[谷歌](http://www.google.com/)。同時,不要忘記提交“[C++類庫FAQ的提交表格](http://www.trumphurst.com/cppsub.html)”來幫助別人 。.
- C++ FAQ Lite
- [1] 復制許可
- [2] 在線站點分發本文檔
- [3] C++-FAQ-Book 與 C++-FAQ-Lite
- [6] 綜述
- [7] 類和對象
- [8] 引用
- [9] 內聯函數
- [10] 構造函數
- [11] 析構函數
- [12] 賦值算符
- [13] 運算符重載
- [14] 友元
- [15] 通過 &lt;iostream&gt; 和 &lt;cstdio&gt;輸入/輸出
- [16] 自由存儲(Freestore)管理
- [17] 異常和錯誤處理
- [18] const正確性
- [19] 繼承 — 基礎
- [20] 繼承 — 虛函數
- [21] 繼承 — 適當的繼承和可置換性
- [22] 繼承 — 抽象基類(ABCs)
- [23] 繼承 — 你所不知道的
- [24] 繼承 — 私有繼承和保護繼承
- [27] 編碼規范
- [28] 學習OO/C++
- [31] 引用與值的語義
- [32] 如何混合C和C++編程
- [33] 成員函數指針
- [35] 模板 ?
- [36] 序列化與反序列化
- [37] 類庫