standard - the c++ library reference guide




“STL”和“C++標準庫”有什麼區別? (4)

“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”,有些人習慣性地使用諸如“STL 包含在C ++標準庫中”這樣的短語,這是明顯不正確的。

我相信繼續以這種方式宣傳這個詞的用法只會導致誤解持續下去。 唉,即使它應該變得更好,嘗試改變事物也許是完全適得其反的。 我們可能會永遠被雙重含義所困擾。

結論

我很欣賞這篇文章有點偏頗:我寫了你鏈接的文章。 :)無論如何,我希望這有助於更好地解釋戰鬥。

更新13/04/2011

以下是使用“STL”引用整個C ++標準庫的人的three perfect examples 。 它繼續困擾著我,許多人都盲目發誓,沒有人會這樣做,因為幾乎每天都能看到。

有人把這篇文章引入我的注意,那就是聲稱(我在解釋) STL術語被誤用來引用整個C ++標準庫,而不是從SGI STL中獲取的部分。

(...)它指的是“STL”,儘管很少有人仍然使用STL(這是在SGI設計的)。

C ++標準庫的一部分是基於STL的一部分,很多人(包括幾位作者和臭名昭著的cplusplus.com)仍將這些部分稱為“STL”。 然而,這是不准確的; 事實上,C ++標準從來沒有提到“STL”,並且兩者之間有內容差異。

(...)“STL”很少用於引用恰好基於SGI STL的stdlib的位。 人們認為這是整個標準庫。 它被放在簡歷上。 這是誤導。

我對C ++的歷史幾乎一無所知,所以我不能判斷文章的正確性。 我是否應該避免使用術語STL? 或者這是一個孤立的意見?


GNU標準C ++庫(libstdc ++)常見問題解答

STL(標準模板庫)是C ++標準庫大塊的靈感來源,但這些術語不可互換,並不代表同一件事。 C ++標準庫包含很多不是來自STL的東西,有些甚至不是模板,比如std::localestd::thread

Libstdc ++ - v3包含了很多來自SGI STL的代碼(最終的合併來自版本3.3 )。 與原始SGI代碼相比,libstdc ++中的代碼包含許多修補程序和更改。

特別是, string不是來自SGI,並且不使用他們的“繩索”類(儘管它包含作為可選的擴展名), valarray也不是其他的。 類似於vector<>類來自SGI,但已經進行了廣泛的修改。

有關libstdc ++演變的更多信息可以在API演進向後兼容性文檔中找到。

SGI的STL FAQ仍然是推薦閱讀。

僅供參考,截至2018年3月,即使官方STL網站www.sgi.com/tech/stl/也沒有了


沒有一個答案是非常正確的。 亞歷山大斯捷潘諾夫開發了一個他稱為STL(當時為惠普工作)的圖書​​館。 該庫隨後被提議列入C ++標準。

這基本上是“分叉”發展。 該委員會包括一些部分,完全拒絕其他人,並重新設計了一些(與亞歷山大的參與)。 原始圖書館的開發後來轉移到了Silicon Graphics,但是從C ++標準庫中分離出來。

將這些片段添加到標準庫後,標準庫的一些其他部分進行了修改,以更好地適應所添加的內容(例如, beginendrbeginrend被添加到std::string因此可以像使用容器)。 大約在同一時間, 大多數庫(甚至是完全不相關的庫)都被製作成模板以適應不同的類型(例如標準流)。

有些人也使用STL作為“標準庫”的簡稱。

這意味著當有人使用術語“STL”時,他們可能指的是大約六種不同的東西中的任何一種。 無論好壞,大多數使用它的人似乎忽略了多重意義,並假設其他人都會認識到他們指的是什麼。 這導致了許多誤解,至少有一些嚴重的火焰戰爭讓大多數參與者看起來很愚蠢,因為他們只是在談論完全不同的事情。

不幸的是,這種混亂可能會持續下去。 引用“STL”比C ++標準庫中的容器,迭代器和算法更方便,但不包括std::string ,儘管它可以像容器一樣工作。 儘管“C ++標準庫”並不那麼長和笨拙,但“STL”仍然更短,更簡單。 直到或除非有人發明更精確的術語(如有必要), 並且方便起見,“STL”將繼續使用並繼續產生混淆。


術語“STL”或“標準模板庫”不會出現在ISO 14882 C ++標準的任何地方。 所以將C ++標準庫稱為STL是錯誤的。 術語“C ++標準庫”或“標準庫”是ISO 14882正式使用的術語:

ISO 14882 C ++標準:

17 - 圖書館介紹[lib.library]:

  1. 本章節描述了C ++標準庫的內容,一個結構良好的C ++程序如何使用該庫以及一致性實現如何提供庫中的實體。

...

STL是最初由Alexander Stepanov設計的獨立於C ++標準的庫。 但是,C ++標準庫的一些組件包括STL組件,如vectorlistcopyswap等算法。

但是,當然C ++標准在STL之外包含了更多的東西,所以術語“C ++標準庫”更加正確(標准文檔實際使用的是這個術語)。





c++-faq