C++標準庫、C++標準模版庫介紹

China Soft發表於2024-09-08

https://blog.csdn.net/weixin_42826139/article/details/87972852

注:每個庫詳細介紹以後會在本文中以超連結形式呈現給大家

1.c++標準庫(C++ Standard Library)
C++強大的功能來源於其豐富的類庫及庫函式資源。 C++標準庫(C++ Standard Library, 亦可稱作,C++標準程式庫)的內容總共在50個標準標頭檔案中定義。在C++開發中,要儘可能地利用標準庫完成。

基本介紹
C++標準庫,C++ Standard Library,是類庫和函式的集合,其使用核心語言寫成,由c++標準委員會制定,並不斷維護更新。
這樣做的直接好處包括:
(1)成本:
已經作為標準提供,不必再花費時間、人力重新開發。
(2)質量:
標準庫的都是經過嚴格測試的,正確性有保證。
(3)效率:
關於人的效率已經體現在成本中了,關於程式碼的執行效率要相信實現標準庫的前輩的水平。
(4)良好的程式設計風格:
採用行業中普遍的做法進行開發。

C++標準更新
c++標準庫的標準化始於1989年,由國際標準化組織(the International Organization for Standardization,ISO)推動。至今完成了四個標準,那就是各種C++ standard:
c++98
1998年批准,是第一份C++標準。文件編號ISO/IEC 14882:1998。
c++03
是一份“技術勘誤”,修復了幾個小bug,文件編號ISO/IEC 14882:2003。
TR1
內含大尺度的標準庫擴充,文件編號ISO/IEC TR 19768:2007。
c++11
對c++內含語言或/和標準庫兩方面皆十分重大的改善和強化。文件編號ISO/IEC 14882:2011。
另外還有最新的:

內容分類
C++標準庫的內容基本可以分以下為10類
(未註明為c++98 03的標準庫)。
C1. 標準庫中與語言支援功能相關的標頭檔案

標頭檔案 描述
<cstddef> 定義宏NULL和offsetof,以及其他標準型別size_t和ptrdiff_t。與對應的標準C標頭檔案的區別是,NULL是C++空指標常量的補充定義(c++11中已有關鍵字nullptr),宏offsetof接受結構或者聯合型別引數,只要他們沒有成員指標型別的非靜態成員即可。(c++11:)nullptr_t是nullptr的型別。
<limits> 提供與基本資料型別相關的定義。例如,對於每個數值資料型別,它定義了可以表示出來的最大值和最小值以及二進位制數字的位數。
<climits> 提供與基本整數資料型別相關的C樣式定義。這些資訊的C++樣式定義在<limits>中
<cfloat> 提供與基本浮點型資料型別相關的C樣式定義。這些資訊的C++樣式定義在<limits>中
<cstdlib> 提供支援程式啟動和終止的宏和函式。這個標頭檔案還宣告瞭許多其他雜項函式,例如搜尋和排序函式,從字串轉換為數值等函式。它與對應的標準C標頭檔案stdlib.h不同,定義了abort(void)。abort()函式還有額外的功能,它不為靜態或自動物件呼叫解構函式,也不呼叫傳給atexit()函式的函式。它還定義了exit()函式的額外功能,可以釋放靜態物件,以註冊的逆序呼叫用atexit()註冊的函式。清除並關閉所有開啟的C流,把控制權返回給主機環境。
<new> 支援動態記憶體分配
<typeinfo> 支援變數在執行期間的型別標識
<exception> 支援異常處理,這是處理程式中可能發生的錯誤的一種方式
<cstdarg> 支援接受數量可變的引數的函式。即在呼叫函式時,可以給函式傳送數量不等的資料項。它定義了宏va_arg、va_end、va_start以及va_list型別
<csetjmp> 為C樣式的非本地跳躍提供函式。這些函式在C++中不常用
<csignal> 為中斷處理提供C樣式支援
C2. 支援流輸入/輸出的標頭檔案

標頭檔案 描述
<iostream> 支援標準流cin、cout、cerr和clog的輸入和輸出,它還支援多位元組字元標準流wcin、wcout、wcerr和wclog
<iomanip> 提供操縱程式,允許改變流的狀態,從而改變輸出的格式
<ios> 定義iostream的基類
<istream> 為管理輸出流快取區的輸入定義模板類
<ostream> 為管理輸出流快取區的輸出定義模板類
<sstream> 支援字串的流輸入輸出
<fstream> 支援檔案的流輸入輸出
<iosfwd> 為輸入輸出物件提供向前的宣告
<streambuf> 支援流輸入和輸出的快取
<cstdio> 為標準流提供C樣式的輸入和輸出
<cwchar> 支援多位元組字元的C樣式輸入輸出
C3. 與診斷功能相關的標頭檔案

標頭檔案 描 述
<stdexcept> 定義標準異常。異常是處理錯誤的方式
<cassert> 定義斷言宏,用於檢查執行期間的情形
<cerrno> 支援C樣式的錯誤資訊
C4. 定義工具函式的標頭檔案

標頭檔案 描 述
<utility> 定義過載的關係運算子,簡化關係運算子的寫入,它還定義了pair型別,該型別是一種模板型別,可以儲存一對值。這些功能在庫的其他地方使用
<functional> 定義了許多函式物件型別和支援函式物件的功能,函式物件是支援operator()()函式呼叫運算子的任意物件
<memory> 給容器、管理記憶體的函式和auto_ptr模板類定義標準記憶體分配器(c++11中增加shared_ptr與unique_ptr,分別支援共享與獨享的動態記憶體分配)
<ctime> 支援系統時鐘函式
C5. 支援字串處理的標頭檔案

標頭檔案 描 述
<string> 為字串型別提供支援和定義,包括單位元組字串(由char組成)的string和多位元組字串(由wchar_t組成)
<cctype> 單位元組字元類別
<cwctype> 多位元組字元類別
<cstring> 為處理非空位元組序列和記憶體塊提供函式。這不同於對應的標準C庫標頭檔案,幾個C樣式字串的一般C庫函式被返回值為const和非const的函式對替代了
<cwchar> 為處理、執行I/O和轉換多位元組字元序列提供函式,這不同於對應的標準C庫標頭檔案,幾個多位元組C樣式字串操作的一般C庫函式被返回值為const和非const的函式對替代了。
<cstdlib> 為把單位元組字串轉換為數值、在多位元組字元和多位元組字串之間轉換提供函式
C6. 定義容器類的模板的標頭檔案

標頭檔案 描 述
<vector> 定義vector序列模板,這是一個大小可以重新設定的陣列型別,比普通陣列更安全、更靈活
<list> 定義list序列模板,這是一個序列的連結串列,常常在任意位置插入和刪除元素
<deque> 定義deque序列模板,支援在開始和結尾的高效插入和刪除操作
<queue> 為佇列(先進先出)資料結構定義序列介面卡queue和priority_queue
<stack> 為堆疊(後進先出)資料結構定義序列介面卡stack
<map> map是一個關聯容器型別,允許根據鍵值是唯一的,且按照升序儲存。multimap類似於map,但鍵不是唯一的
<set> set是一個關聯容器型別,用於以升序方式儲存唯一值。multiset類似於set,但是值不必是唯一的。
<bitset> 為固定長度的位序列定義bitset模板,它可以看作固定長度的緊湊型bool陣列
<array> (TR1)固定大小陣列,支援複製
<forward_list> (c++11)單向列表,支援快速隨機訪問
<unordered_set> (TR1)無序容器set,其元素隨機存放。multiset類似於set,但是值不必是唯一的
<unordered_map> (TR1)無序容器map,其鍵值隨機存放。multimap類似於map,但鍵不是唯一的
C7. 支援迭代器的標頭檔案

標頭檔案 描 述
<iterator> 給迭代器提供定義和支援
C8. 有關演算法的標頭檔案

標頭檔案 描 述
<algorithm> 提供一組基於演算法的函式,包括置換、排序、合併和搜尋
<cstdlib> 宣告C標準庫函式bsearch()和qsort(),進行搜尋和排序
<ciso646> 允許在程式碼中使用and代替&&
C9. 有關數值操作的標頭檔案

標頭檔案 描 述
<complex> 支援複雜數值的定義和操作
<valarray> 支援數值向量的操作
<numeric> 在數值序列上定義一組一般數學操作,例如accumulate和inner_product
<cmath> 這是C數學庫,其中還附加了過載函式,以支援C++約定
<cstdlib> 提供的函式可以提取整數的絕對值,對整數進行取餘數操作
C10. 有關本地化的標頭檔案

標頭檔案 描 述
<locale> 提供的本地化包括字元類別、排序序列以及貨幣和日期表示
<clocale> 對本地化提供C樣式支援
2.C++標準模版庫(C++ STL)
STL是Standard Template Library的簡稱,中文名標準模板庫,惠普實驗室開發的一系列軟體的統稱。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普實驗室工作時所開發出來的。從根本上說,STL是一些“容器”的集合,這些“容器”有list,vector,set,map等,STL也是演算法和其他一些元件的集合。這裡的“容器”和演算法的集合指的是世界上很多聰明人很多年的傑作。STL的目的是標準化元件,這樣就不用重新開發,可以使用現成的元件。STL現在是C++的一部分,因此不用安裝額外的庫檔案。

STL的版本很多,常見的有HP STL、PJ STL、 SGI STL等。

在C++標準中,STL被組織為下面的13個標頭檔案:<algorithm>、<deque>、<functional>、<iterator>、<array>、<vector>、<list>、<forward_list>、<map>、<unordered_map>、<memory>、<numeric>、<queue>、<set>、<unordered_set>、<stack>和<utility>。

組成部分
STL可分為六個部分

容器(containers)
迭代器(iterators)
空間配置器(allocator)
配接器(adapters)
演算法(algorithms)
仿函式(functors)
容器
在實際的開發過程中,資料結構本身的重要性不會遜於操作於資料結構的演算法的重要性,當程式中存在著對時間要求很高的部分時,資料結構的選擇就顯得更加重要。

經典的資料結構數量有限,但是我們常常重複著一些為了實現向量、連結串列等結構而編寫的程式碼,這些程式碼都十分相似,只是為了適應不同資料的變化而在細節上有所出入。STL容器就為我們提供了這樣的方便,它允許我們重複利用已有的實現構造自己的特定型別下的資料結構,透過設定一些模板類,STL容器對最常用的資料結構提供了支援,這些模板的引數允許我們指定容器中元素的資料型別,可以將我們許多重複而乏味的工作簡化。

容器部分主要由標頭檔案<vector>,<list>,<deque>,<set>,<map>,<stack>和<queue>組成。對於常用的一些容器和容器介面卡(可以看作由其它容器實現的容器),可以透過下表總結一下它們和相應標頭檔案的對應關係。

序列式容器

向量(vector) 連續儲存的元素<vector>
列表(list) 由節點組成的雙向連結串列,每個結點包含著一個元素<list>
雙端佇列(deque) 連續儲存的指向不同元素的指標所組成的陣列<deque>
介面卡容器

棧(stack) 後進先出的值的排列 <stack>
佇列(queue) 先進先出的值的排列 <queue>
優先佇列(priority_queue) 元素的次序是由作用於所儲存的值對上的某種謂詞決定的的一種佇列 <queue>
關聯式容器

集合(set) 由節點組成的紅黑樹,每個節點都包含著一個元素,節點之間以某種作用於元素對的謂詞排列,沒有兩個不同的元素能夠擁有相同的次序 <set>
多重集合(multiset) 允許存在兩個次序相等的元素的集合 <set>
對映(map) 由{鍵,值}對組成的集合,以某種作用於鍵對上的謂詞排列 <map>
多重對映(multimap) 允許鍵對有相等的次序的對映 <map>
迭代器
下面要說的迭代器從作用上來說是最基本的部分,可是理解起來比前兩者都要費力一些(至少筆者是這樣)。軟體設計有一個基本原則,所有的問題都可以透過引進一個間接層來簡化,這種簡化在STL中就是用迭代器來完成的。概括來說,迭代器在STL中用來將演算法和容器聯絡起來,起著一種黏和劑的作用。幾乎STL提供的所有演算法都是透過迭代器存取元素序列進行工作的,每一個容器都定義了其本身所專有的迭代器,用以存取容器中的元素。

迭代器部分主要由標頭檔案<utility>,<iterator>和<memory>組成:

<utility>是一個很小的標頭檔案,它包括了貫穿使用在STL中的幾個模板的宣告,
<iterator>中提供了迭代器使用的許多方法,
<memory>的描述則十分的困難,它以不同尋常的方式為容器中的元素分配儲存空間,同時也為某些演算法執行期間產生的臨時物件提供機制,<memory>中的主要部分是模板類allocator,它負責產生所有容器中的預設分配器。
演算法
大家都能取得的一個共識是函式庫對資料型別的選擇對其可重用性起著至關重要的作用。舉例來說,一個求方根的函式,在使用浮點數作為其引數型別的情況下的可重用性肯定比使用整型作為它的引數型別要高。而C++透過模板的機制允許推遲對某些型別的選擇,直到真正想使用模板或者說對模板進行特化的時候,STL就利用了這一點提供了相當多的有用演算法。它是在一個有效的框架中完成這些演算法的——你可以將所有的型別劃分為少數的幾類,然後就可以在模版的引數中使用一種型別替換掉同一種類中的其他型別。

STL提供了大約100個實現演算法的模版函式,比如演算法for_each將為指定序列中的每一個元素呼叫指定的函式,stable_sort以你所指定的規則對序列進行穩定性排序等等。這樣一來,只要我們熟悉了STL之後,許多程式碼可以被大大的化簡,只需要透過呼叫一兩個演算法模板,就可以完成所需要的功能並大大地提升效率。

演算法部分主要由標頭檔案<algorithm>,<numeric>和<functional>組成:

<algorithm>是所有STL標頭檔案中最大的一個(然而它很好理解),它是由一大堆模版函式組成的,可以認為每個函式在很大程度上都是獨立的,其中常用到的功能範圍涉及到比較、交換、查詢、遍歷操作、複製、修改、移除、反轉、排序、合併等等
<numeric>體積很小,只包括幾個在序列上面進行簡單數學運算的模板函式,包括加法和乘法在序列上的一些操作
<functional>中則定義了一些模板類,用以宣告函式物件
結束語
後續博主會詳細介紹一些標準庫,容器類,演算法類,迭代器類,字串等等…
————————————————

版權宣告:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連結和本宣告。

原文連結:https://blog.csdn.net/weixin_42826139/article/details/87972852

相關文章