STL(Standard Template Library)是 C++ 標準庫的核心,由 Alexander Stepanov 等人在 HP 實驗室開發,以「泛型程式設計」理念將資料結構(容器)、操作邏輯(演算法)、存取介面(迭代器)三者解耦。本文系統介紹 STL 三大支柱、13 個標準頭檔、核心容器特性對照表、迭代器分類與學習建議。
| 支柱 | 核心頭檔 | 職責 | 關鍵特性 |
|---|---|---|---|
| 容器 | <vector> <list> <deque> <set> <map> <stack> <queue> | 管理資料儲存與記憶體 | 型別安全、自動記憶體、統一介面 |
| 演算法 | <algorithm> <numeric> <functional> | 提供通用操作(排序、搜尋、變換) | 泛型、與容器解耦、約 100 個函式 |
| 迭代器 | <iterator> <utility> <memory> | 統一存取介面,連結演算法與容器 | 五大類別、智慧指標雛形、配置器 |
| 容器 | 底層結構 | 隨機存取 | 插入/刪除 | 有序性 | 適用場景 |
|---|---|---|---|---|---|
vector | 動態陣列 | O(1) | 尾部 O(1),中間 O(n) | 插入序 | 高頻隨機存取、尾部增刪 |
list | 雙向鏈表 | O(n) | O(1) 已知位置 | 插入序 | 頻繁中間增刪、穩定迭代器 |
deque | 分段陣列 | O(1) | 雙端 O(1) | 插入序 | 雙端佇列、需隨機存取 |
set/multiset | 紅黑樹 | O(log n) | O(log n) | 鍵值序 | 唯一/可重複鍵值、快速查找 |
map/multimap | 紅黑樹 | O(log n) | O(log n) | 鍵值序 | 鍵值對映射、字典、索引 |
stack | deque/list | 無 | 頂端 O(1) | LIFO | 遞迴模擬、語法分析 |
queue | deque/list | 無 | 兩端 O(1) | FIFO | BFS、任務排程 |
priority_queue | heap | 無 | O(log n) | 優先序 | Dijkstra、Huffman、事件模擬 |
find, count, search, for_eachcopy, transform, replace, remove, reverse, rotatesort, stable_sort, binary_search, lower_bound, upper_boundmerge, set_union, set_intersection, inplace_merge<numeric>):accumulate, inner_product, partial_sum, adjacent_difference<functional>):less, greater, plus, bind1st, mem_fun| 類別 | 能力 | 支援演算法 | 容器範例 |
|---|---|---|---|
| Input | 單向唯讀 | find, copy | istream_iterator |
| Output | 單向唯寫 | copy, transform | ostream_iterator |
| Forward | 單向可多讀 | 以上 + replace | forward_list |
| Bidirectional | 雙向 | 以上 + reverse | list, set, map |
| Random Access | 雙向 + 算術 | 所有(含 sort, binary_search) | vector, deque, string |
關鍵洞見:演算法要求的迭代器類別決定了可用容器範圍(如 sort 需 Random Access,故 list 需自行 list::sort)。
<memory> 核心為 allocator<T>,封裝 allocate/deallocate/construct/destroy。allocator,可自訂配置器實現記憶體池、共享記憶體、GC 整合。auto_ptr(C++98)→ unique_ptr/shared_ptr(C++11)演進自配置器機制。vector、sort、find 開始實戰,體會「泛型」威力。begin/end 半開區間慣例。for_each/transform/accumulate 就不用 for。vector::insert 可能失效所有迭代器,list 僅失效被刪除者。STL 不只是工具箱,更是一種「以型別參數化演算法、以迭代器統一存取」的思維框架。掌握它,C++ 程式設計將進入工業級標準化軌道。