c++的標準庫主要包含兩大類,首先是包含c的標準庫的,當然,為了適應c++對一些c庫進行了少許的修改和增加。最重要的當然是物件導向的c++庫;而c++庫又可以分成兩大類,即物件導向的c++庫和標準模板庫,也就是題目中的stl。另外在此基礎上,還要提醒同學們的是,除了上面的庫,在各個平台的開發廠商中,還會針對實際情況,對標準庫進行擴充套件,這些可以歸納為擴充套件庫。
同時,隨著c++標準的不斷迭代,還推出了很多新的庫,同學們需要不斷的學習跟進,目前最新的c++標準為c++20。主流的c++標準庫實現有gnu/linux上的libstdc++;ios的libc++;微軟的crt,android的libc++,當然在ndk有過很多c++的版本,不過後來都被刪除了;其它包括ustl,apache等很多大公司也有自己的相關的c++庫(這裡就不能叫標準庫了,雖然實現的目的是一樣的)。下面是相關庫的基本組成部分分類:
c庫主要包括:
1、標準輸入輸出,比如stdin,stdout,stderr。
2、字串處理,比如strcat,strcopy等。
3、記憶體管理,如果malloc等。
4、日期、時間和本地化等如ctime,time,localtime等。
5、數學相關函式,如pow,cos等。
6、系統和管理相關函式,它定義了和os相關的訊號和函式呼叫規則,如setjmp,va_start等。
7、異常和錯誤,最典型的就是errno。
8、其它輔助如一些巨集定義等。
c++庫主要包括:
1、標準的io類,如std::cout,std::in,ofstream等。
2、必須要提到的std::string。
3、數值處理相關類,numeric的complex。
4、本地化庫。
5、異常庫。
6、其它。
7、stl(標準模板庫)。
在後面的學習應用中將以stl為主,穿插學習標準庫的其它用法。
stl標準模板庫主要分類:
1、stl容器(containers),包含順序容器和關聯容器以及無序容器
容器非常好理解,日常的容器可以盛納各種液體和物品。而在stl的容器可以盛納各種資料。它分為順序容器和關聯容器兩大類,順序容器是指讀寫按照容器內的元素位置進行操作。你可以理解成乙個箱子裡有好多小格仔,你可以根據小格仔的順序來取到其中的內容。它主要包括向量(vector),鍊錶(list)和雙端佇列(deque);而關聯容器則是需要通過乙個鍵值(key)來讀寫容器的元素。在標準庫里主要就是對映(map)和集合(set)。無序容器主要包括unordered_set和unordered_map。
2、stl迭代器(iterators)
迭代器其實更好理解,就是一種可以通用在容器中的遍歷訪問的模板指標。就是乙個資料訪問的索引。
3、stl分配器(allocators)
分配器其實就是為了方便對容器等的通用化記憶體管理,提供的一種記憶體分配管理機制,可以理解成一種stl中的記憶體池。
4、stl介面卡(adapters)
介面卡這個概念有點意思,其實如果有過介面開發經驗的可能更容易明白,兩種不同的介面要想使用同乙個資料體系,就需要寫乙個小模組來進行介面資料的統一,這個小模組就叫做介面卡。它其實是一種設計模式,而這種思想體現在stl中,就成為了介面卡。
5、stl仿函式(函式物件)(functors)
仿函式,有的翻譯成函式物件,這個更有意思,其實就是通過前面提到的過載運算子(),實現了類似於函式使用的機制。在c++11後,提供了更安全的std::function。
6、stl演算法(functors)
模板庫最初其實就是為了實現演算法而設計的,這個在《c++程式設計思想》中的「通用演算法」中有過提及。演算法可能是同學們最容易理解但最不容易掌握的一部分了。比如常見的查詢,排序以及刪除、複製等。
後面會對這些stl的基本容器和演算法逐一進行分析,這裡給出乙個綜合例子:
#include #include #include #include #include #include struct data
;//類似陣列
void testvector()
//鍊錶
void testlist()
//佇列
void testqueue()
int buf = ;
void testsort()
; std::sort(arr.begin(), arr.end());
std::cout <
for (int num = 0; num
std::cout <
}void testsearch()
void testcopy()
; std::copy(buf,buf+16,buf_dst);
std::cout <
for (auto& au : buf_dst)
std::cout <
}int main()
執行結果是:
vector first:0
vector size:2
list first:9
list size:3
queue first:10
queue first:20
queue first:30
ordered reslut:
0 9 11 11 11 19 21 36 60 68 88 96 96 126 168 199
search result:1
copy result:
9 10 11 11 11 19 21 36 60 68 88 96 96 126 168 199 0 0 0 0
stl test project!
這裡仍然提醒注意的是,新標準在快速迭代,要注意更新標準的知識。
1、c++標準庫不是萬能的,有些庫其實並不多受歡迎,比如標準輸入輸出的流操作。
2、c++標準庫使用不複雜,但內部機制越來越複雜,特別模板機制,本身就是乙個複雜而又困難的事情。而新標準中增加的協程等更是提高了內部實現的複雜度。
3、c++標準從c++11迭代的速度明顯加快,要注意新版本的更新和跟進。
在stl的學習過程中,會把相關的原始碼解析也會展開一部分,這樣,既可以更好的了解庫的內部實現,又容易理解庫的應用情況。stl是學c++的人繞不過去的庫,不想用,不代表不需要。
跟我學C 中級篇 STL的容器Array
stl中的array陣列型別是在c tr1中才提出的,在之前只有vector這個類似於陣列的型別。但在實際應用中發現,vector和實際應用陣列還是有非常大的區別,包括迭代器訪問的控制,記憶體大小的控制等。用過vector的很容易發現它和實際使用中的陣列的諸多不同之處。換句話說,實際開發過程中,還是...
跟我學C 中級篇 STL的容器vector
std vector的原始碼很容易找到,其實你看它 也不複雜,之所以看上去眼花繚亂的原因不是因為他複雜,而是為了相容和安全性搞了好多新功能和方法,再加上一些模板本身的技巧。這些都可以暫時忽略過去,重點看重點的相關的函式方法的實現。向量的建構函式其實就是兩部分模板型別名稱和分配器,而分配器一般使用預設...
跟我學c 中級篇 pimpl
private implementation,私有化實現。在c 中,由於語言本身的限制,沒有純粹的介面定義。這就導致了在介面的使用上很多c 的人員都是隨心而動。有用抽象類的純虛函式的,有直接用c型別的介面的。有乾脆提供介面類的 不一而足吧。根據實際情況,實事求是的選擇才是乙個好的標準。在c 中,大量...