文章目錄
前言
一、什么是STL
二、STL的版本
1、原始版本
2、P.J.版本
3、RW版本
4、SGI版本
三、閉源、開源
四、STL的六大組件
總結
前言
路漫漫其修遠兮,吾將上下而求索;
一、什么是STL
STL(standard template libaray 標準模板庫):是C++標準庫的重要組成部分,不僅是一個可復用的組件庫,而且是一個包羅數據結構與算法的軟件框架;
注:標準庫指的是C++所有官方實現的庫;而STL(標準模板庫),用模板去實現常見的數據結構與算法;C++之中提供的標準庫中提供數據結構和算法的一套庫,以方便我們去使用;
Q:標準庫中除了STL還有什么?
- IO流庫、線程庫、異常、智能指針……
二、STL的版本
STL(Standard Template Library)的設計與實現并非由C++創始人本賈尼·斯特勞斯特魯普(Bjarne Stroustrup)直接完成,而是由Alexander Stepanov、David Musser和 Meng Lee在惠普實驗室開發。該項目后來以開源方式發布,代碼開放給社區,最終被納入C++標準庫,成為現代C++的核心組成部分。STL的核心貢獻在于引入了泛型編程范式,提供了容器、算法和迭代器的高效抽象,極大提升了C++的靈活性和性能表現。
注:開源有一個開源協議的要求:如果你進行了有效的修改,你也要像原始版本一樣開源(不開源的話,別人有權告你);
1、原始版本
Alexander Stepanov 、David Musser、Meng Lee 在惠普實驗室完成的原始版本,本著開源精神,他們聲明允許任何人任意運用、拷貝、修改、傳播、商業使用這些代碼,無需付費;唯一條件就是也需要向原始版本一樣做開源使用;HP版本——所有STL實現版本的始祖;
2、P.J.版本
?P.J. Plauger 基于 HP STL 開發了自己的實現,并創立了?Dinkumware?公司來提供商業化的 C/C++ 標準庫實現;不能公開或者修改,缺陷:可讀性比較差,符號命名比較怪異;?Microsoft Visual C++?長期采用 Dinkumware 的 STL (以及整個 C++ 標準庫) 作為其實現基礎。直到較新版本的 MSVC (如 VS 2019/2022 的部分版本) 才開始逐步替換為微軟自研的實現(但仍有繼承關系)
3、RW版本
由Rouge Wage 公司開發,繼承自HP版本,被?Borland C++ Builder采用,不能公開或者修改,可讀性一般;大概二十年前,Builder 比較出名的,但是后來被微軟干掉,沒人維護于是就沒落了;
4、SGI版本
由Silicon Graputer Systems ,Ins 公司開發,繼承自HP版本,被?GNU C++ Library (libstdc++
)?采用作為其 STL 部分的基礎實現。而?libstdc++
?是?GCC (GNU Compiler Collection)?的默認 C++ 標準庫,因此廣泛應用于?Linux?系統以及其他使用 GCC 的平臺(如早期的 Mac OS X, Cygwin, MinGW 等);SGI版本可移植性好,可公開、修改甚至販賣,從命名風格和編程風格上看,閱讀性非常高。
我們在談STL這個庫的時候需要注意在VS版本下的STL源代碼與Linux 下STL的源代碼是不一樣的;雖然P.J.版本和SGI版本會提供相同的接口,但是其底層實現是不同的(eg. string的擴容方式;在SGI版本中采用2倍擴容,但是P.J.版本是1.5 倍擴容);
三、閉源、開源
需要注意的是,計算機中的源代碼分為閉源、開源;
- 閉源:由商業公司開發的,其源代碼不會對外公布;eg.Windows、mas oc?
- 開源:eg.Linux、git? 開源就意味著免費;因為免費,所以各公司的服務器都是部署在Linux 上面;如果公司有一些特殊需求,可以招一些搞內核的人,對操作系統進行一些改造(重寫驅動等)
注:Gitub 是利用git 這個開源項目去搭建的網站而形成的一個“社會”;
Q: 閉源與開源分別有什么優缺點?
- 開源的項目如果不是特別出名,是很難維護起來的,即使比較出名的開源項目可能到一定的階段就有可能沒有多少人去維護;閉源的項目,具有商業性質,會以公司的性質去招募一些人來對這個閉源項目進行維護、發展;不要認為開源一定好,而閉源的不一定好……其實開源和閉源各有各的好處;
四、STL的六大組件
STL的核心是數據結構與算法,但其中又分為了6大組件
其中空間配置器就是內存池;
內存池是給容器使用的;因容器可能會高頻地申請釋放內存,不建立內存池便會在堆上向操作系統申請空間,而不停地打斷操作系統會有嚴重的效率損失,故而STL給他自己所有的容器統一建立了一個內存池以供其專用以提高這些數據結構申請、釋放內存的效率;需要注意的是,部分算法若會高頻地申請、釋放內存,內存池也會給部分算法使用,eg.歸并排序;
總結
1、STL(standard template libaray 標準模板庫):是C++標準庫的重要組成部分,不僅是一個可復用的組件庫,而且是一個包羅數據結構與算法的軟件框架;
2、STL在C++的學習中非常重要,需要我們熟練掌握容器接口的使用……