STL(standard template libaray-標準模板庫),是C++標準庫的重要組成部分,包含了很多常用的數據結構和算法。
在我們學習了模板的之后,再來看STL,就能知道它是C++標準庫中的模板類和模板函數的集合,作為可復用的庫大大提高了程序員的工作效率。
STL主要組成包括:
- 容器(Containers):封裝各種數據結構,如數組、鏈表、集合等。
- 算法(Algorithms):提供排序、查找、拷貝、合并等通用算法。
- 迭代器(Iterators):連接容器與算法的橋梁,用來遍歷容器。
- 函數對象(Function Objects / Functors):行為像函數的對象,用于定制算法行為。
- 適配器(Adapters):對已有組件進行封裝,使其接口發生變化(如 stack、queue)。
- 分配器(Allocators):負責內存分配,通常使用默認的分配器。
概要如下圖所示:
說到STL,就不得不說到泛型編程,這也是上次提到過的一種編程方式。具體可以查看:【C++】Chaper03 函數模板與泛型-CSDN博客
接下來進行幾個部分的大致介紹。
一、STL容器
容器大致分為三類,分別是序列式容器、關聯式容器、無序容器。
1. 序列式容器(Sequence Containers)
保持元素的排列順序。
vector
:動態數組,支持隨機訪問,尾部插入刪除高效。deque
:雙端隊列,頭尾插入刪除都高效。list
:雙向鏈表,任意位置插入刪除高效,但不支持隨機訪問。forward_list
:C++11引入,單向鏈表。array
:定長數組,C++11引入。
2. 關聯式容器(Associative Containers)
自動按鍵排序(通常為紅黑樹實現)。
set
:鍵的集合,不允許重復。multiset
:允許重復鍵。map
:鍵值對,鍵唯一。multimap
:鍵值對,鍵可重復。
3. 無序容器(Unordered Containers)
基于哈希表實現,C++11 引入。
unordered_set
、unordered_multiset
unordered_map
、unordered_multimap
二、迭代器(Iterators)
STL中的迭代器類似于指針,用于訪問容器中的元素。
常見迭代器類型:
input_iterator
:只讀,單向(如 istream_iterator)output_iterator
:只寫,單向(如 ostream_iterator)forward_iterator
:可讀寫,單向(如 forward_list)bidirectional_iterator
:雙向(如 list)random_access_iterator
:隨機訪問(如 vector、deque)
三、STL算法(Algorithms)
STL 提供了約 60 多種通用算法,主要分為以下幾類:
- 非變序算法:不修改原始容器內容(如
find
、count
、for_each
) - 變序算法:可能會修改容器(如
copy
、replace
、remove
) - 排序和比較:
sort
、stable_sort
、min
、max
- 數值算法:
accumulate
、inner_product
(需#include <numeric>
)
四、函數對象(Function Objects)
函數對象是重載了 operator()
的類或結構體,可以像函數一樣調用。常用于定制排序規則等。
例如:
struct MyCompare {bool operator()(int a, int b) {return a > b; // 降序}
};std::sort(vec.begin(), vec.end(), MyCompare());
五、適配器(Adapters)
對現有的容器或函數進行封裝,改變其接口。
- 容器適配器:
stack
、queue
、priority_queue
- 迭代器適配器:
reverse_iterator
、insert_iterator
- 函數適配器:
bind
、not1
、mem_fun
(C++11推薦使用std::bind
和 Lambda)
六、分配器(Allocators)
用于抽象和管理內存的分配與釋放。一般用默認的分配器,但也可以自定義內存管理策略。
標準分配器 std::allocator
:
std::allocator
是 C++ 標準庫提供的默認分配器,實現了最基本的內存分配和對象管理功能。其定義位于頭文件 中。主要成員函數包括:
- allocate:分配未構造的內存。
- deallocate:釋放先前分配的內存。
- construct:在已分配的內存上構造對象(C++17 之前)。
- destroy:調用對象的析構函數(C++17 之前)2。
自定義分配器:
自定義分配器允許開發者控制內存管理策略。例如,可以實現一個內存池分配器,以減少頻繁的內存分配和釋放帶來的開銷。
STL的優點與缺點
STL的優點與缺點
優點:
- 高效:模板和內聯使得STL非常高效。
- 通用:一套算法可作用于不同容器。
- 易用:編寫高質量代碼更容易。
缺點:
- 編譯慢:模板膨脹嚴重。
- 錯誤提示晦澀難懂。
- 可定制性有限(例如自定義內存管理復雜)。