跟我學C 中級篇 STL的學習

2021-10-13 15:33:32 字數 3221 閱讀 9915

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 中,大量...