有人引發了個人注意, 這篇文章聲稱(個人意思是) STL術語被誤用於指代整個C ++標準庫,而不是指從SGI STL中得到的部分。 html
(...)它指的是「 STL」,儘管實際上仍然不多有人使用STL(它是SGI設計的)。 c++
C ++標準庫的某些部分是基於STL的,所以不少人(包括數位做者和臭名昭著的cplusplus.com)仍然將這些部分稱爲「 STL」。 可是,這是不許確的。 實際上,C ++標準從不說起「 STL」,而且二者之間存在內容差別。 程序員
(...)不多使用「 STL」來指代stdlib中剛好基於SGI STL的位。 人們認爲這是整個標準庫。 它被放在簡歷上。 這是一種誤導。 web
我幾乎不瞭解C ++的歷史,所以我沒法判斷本文的正確性。 我應該避免使用術語STL嗎? 仍是這是一個孤立的意見? 算法
從GNU標準C ++庫(libstdc ++)常見問題解答 : api
STL(標準模板庫)是C ++標準庫大塊代碼的靈感來源,但這些術語不可互換,而且含義不相同。 C ++標準庫包含許多不是來自STL的東西,其中一些甚至都不是模板,例如std::locale
和std::thread
。 學習
Libstdc ++-v3包含了SGI STL的許多代碼(最終合併來自3.3版 )。 與原始SGI代碼相比,libstdc ++中的代碼包含許多修復和更改。 網站
特別地, string
不是來自SGI,而且不使用其「 rope」類(儘管做爲可選擴展包含在內), valarray
也不是其餘一些。 像vector<>
這樣的類來自SGI,但已進行了大量修改。 spa
有關libstdc ++演變的更多信息,請參見API進化和向後兼容性文檔。 .net
仍建議閱讀有關SGI STL的FAQ 。
僅供參考,截至2018年3月,甚至STL官方網站www.sgi.com/tech/stl/也已消失 。
術語「 STL」或「標準模板庫」在ISO 14882 C ++標準中沒有出現。 所以,將C ++標準庫稱爲STL是錯誤的。 術語「 C ++標準庫」或「標準庫」是ISO 14882正式使用的術語:
ISO 14882 C ++標準:
17-庫簡介[lib.library]:
- 本條款描述了C ++標準庫的內容,格式正確的C ++程序如何利用該庫以及符合標準的實現方式如何在庫中提供實體。
...
STL是最初由Alexander Stepanov設計的,獨立於C ++標準的庫。 可是,C ++標準庫的某些組件包括STL組件(例如vector
, list
和算法(例如copy
和swap
。
可是,固然,C ++標準在STL以外包含更多內容,所以術語「 C ++標準庫」更正確(這是標準文檔實際使用的內容)。
「 STL」 是由Alexander Stepanov在C ++標準化以前的幾天編寫的 。 C ++早在80年代就已存在,可是咱們如今所說的「 C ++ 」是ISO / IEC 14882:2014(以及更早的版本,例如ISO / IEC 14882:2011)中標準化的語言。
STL已被普遍用做C ++庫,使程序員能夠訪問容器,迭代器和算法。 發生標準化時,語言委員會將C ++標準庫(這是語言標準的一部分)的某些部分設計爲與STL 很是匹配。
多年來,儘管這兩個實體是獨立的而且存在一些差別,但許多人(包括著名的書做家和各類網站)繼續將C ++標準庫稱爲「 STL」。 這些差別在即將到來的新C ++標準中更加明顯,該標準包括各類功能並顯着更改了某些類。
原始STL如今一般稱爲「 C ++標準模板庫的實現」(而不是追溯到實際的歷史記錄!),就像Microsoft Visual Studio或GCC提供C ++標準庫的實現同樣。 可是「標準模板庫」和「標準庫」不是一回事。
爭論的焦點是當前的標準庫是所有仍是部分被稱爲「 STL」,和/或它的名稱是否重要。
對於「 STL」
有一種流派說,每一個人如今都知道「 STL」是標準庫,就像如今每一個人都知道「 C ++」是ISO標準化語言同樣。
其中還包括那些相信只要各方都瞭解正在討論的內容並無什麼關係的人 。
這個術語因野獸的性質而變得更加廣泛,其中不少都大量使用了稱爲「模板」的C ++功能。
對於「 C ++標準庫」(或stdlib)
可是,我同意另外一種思想流派,那就是這使人困惑。 第一次學習C ++的人不知道這種區別,而且可能不會注意到小的語言差別。
該文章的做者曾屢次遇到人們,他們相信整個C ++標準庫都是 STL,包括從未包含在STL中的功能。 相比之下,「 STL」的大多數支持者確切地知道它們的含義,並拒絕相信並不是每一個人都「理解」它。 顯然,該術語的用法並不統一。
另外,實際上有一些相似STL的庫是原始STL的實現,而不是C ++標準庫。 直到最近, STLPort仍是其中之一(甚至在那裏, 混亂還比比皆是!)。
此外,C ++標準在任何地方都不包含文本「 STL」,而且某些人習慣使用諸如「 C ++標準庫中包含 STL」之類的短語,這顯然是錯誤的。
我相信,以這種方式繼續傳播該術語的用法只會致使永遠的誤解。 las,嘗試改變事物可能徹底拔苗助長,即便應該作得更好。 咱們可能永遠只是雙重含義。
結論
我感謝這篇文章有些偏頗:我寫了您連接到的文章。 :)不管如何,我但願這有助於更好地解釋這場戰鬥。
更新13/04/2011
這是三個使用「 STL」來引用整個C ++標準庫的人的完美 示例 。 令我感到困惑的是,有如此多的人發誓盲目,而幾乎天天均可以看到的狀況下,沒人能作到這一點。
我最近也提出了一樣的論點,但我相信能夠容許一些寬容。 若是斯科特·邁耶斯(Scott Meyers)犯了一樣的錯誤,則說明您的公司很好。
沒有一個答案是正確的。 Alexander Stepanov開發了一個名爲STL的庫(當時在HP工做)。 而後建議將該庫包含在C ++標準中。
這基本上是「分叉」的發展。 該委員會包括一些部分,徹底拒絕了其餘部分,並從新設計了一些部分(亞歷山大的參與)。 原始庫的開發後來轉移到了Silicon Graphics,但與C ++標準庫分開繼續進行。
以後這些做品被添加到標準庫,標準庫的其餘一些地方進行了修改,以適應加入什麼更好的(例如, begin
, end
, rbegin
和rend
加入std::string
,所以它能夠像使用容器)。 大約在同一時間, 大多數庫(甚至是徹底不相關的部分)被製成模板以容納不一樣類型(例如標準流)。
有些人也將STL用做「標準庫」的簡稱。
這意味着當有人使用「 STL」一詞時,他們可能指的是大約六種不一樣的事物中的任何一種。 不論是好是壞,大多數使用它的人彷佛都忽略了意義的多重性,並假設其餘全部人都會認識到他們所指的是什麼。 這致使了許多誤解,而且至少發生了幾場嚴重的大戰,使大多數參與者看上去很愚蠢,由於他們只是在談論徹底不一樣的事情。
不幸的是,這種混亂極可能會持續下去。 引用「 STL」要比「 C ++標準庫中的容器,迭代器和算法,但不包括std::string
,即便它能夠像容器同樣」要方便得多。 儘管「 C ++標準庫」並不那麼長且笨拙,但「 STL」仍然要短得多且簡單得多。 直到或除非有人發明了更精確的術語(必要時), 而且也同樣方便,不然將繼續使用「 STL」,而且會繼續形成混淆。