STL 體現泛型程式設計 (GP):演算法與資料結構解耦,以迭代器為介面契約,實現高度復用與效能。
| 容器 | 底層結構 | 特性 | 適用場景 | 頭檔 |
|---|---|---|---|---|
| vector | 動態陣列 | 隨機存取 O(1),尾端增刪 O(1) 攤還,中間增刪 O(n) | 預設首選、需隨機存取、記憶體連續 | <vector> |
| deque | 分段陣列 | 雙端增刪 O(1),隨機存取 O(1) | 雙端佇列、需頭尾高效操作 | <deque> |
| list | 雙向鏈結串列 | 任意位置增刪 O(1) (已有迭代器),無隨機存取 | 頻繁中間增刪、大型物件避免搬移 | <list> |
| forward_list | 單向鏈結串列 | 單向、記憶體輕量 | 只需單向遍歷、極度省記憶體 | <forward_list> |
| array | 固定大小陣列 | 編譯期大小、零額外開銷 | 替代 C 風格陣列、堆疊分配 | <array> |
| stack | 容器配接器 (預設 deque) | LIFO,僅頂端操作 | 遞迴轉迭代、語法分析 | <stack> |
| queue | 容器配接器 (預設 deque) | FIFO,雙端操作 | BFS、任務排程 | <queue> |
| priority_queue | 堆 (預設 vector) | 最大元素優先,插入/取出 O(log n) | Dijkstra、Huffman、事件模擬 | <queue> |
| set/multiset | 紅黑樹 (RB-tree) | 有序、唯一/可重複,查找/插入/刪除 O(log n) | 去重、區間查詢、有序集合 | <set> |
| map/multimap | 紅黑樹 | 鍵值對、鍵有序唯一/可重複 | 字典、索引、計數器 | <map> |
| unordered_set/map | 雜湊表 | 平均 O(1) 查找/插入/刪除,無序 | 高效查找、大資料量、不需有序 | <unordered_set>/<unordered_map> |
set/map 用自帶 find() (O(log n)),勿用通用 std::find (O(n))。vector/deque 用 std::sort (introsort);list 用成員 sort() (merge sort,避免隨機存取)。vector::reserve(n) 預先分配,避免多次重新分配搬移。shrink_to_fit() (C++11) 釋放多餘容量。std::string, std::vector 等物件的效能。| 類別 | 能力 | 支援容器 | 演算法範例 |
|---|---|---|---|
| Input | 單向唯讀 | istream_iterator | std::copy (來源) |
| Output | 單向唯寫 | ostream_iterator, back_insert_iterator | std::copy (目的) |
| Forward | 單向讀寫、多遍歷 | forward_list | std::find |
| Bidirectional | 雙向讀寫 | list, set, map, multimap | std::reverse, std::sort (需 RandomAccess) |
| RandomAccess | 隨機讀寫、算術運算 | vector, deque, array, string | std::sort, std::nth_element, std::binary_search |
原則:演算法要求的迭代器類別 ≤ 容器提供的類別。std::sort 需 RandomAccess,故 list 無法使用,必須用 list::sort()。
list 管理動態訊息、map 14,000 筆索引、vector 批次緩衝。std::for_each 驅動流程。for_each, find, find_if, count, count_if 覆蓋 80% 需求。| 陷阱 | 後果 | 解決 |
|---|---|---|
| 迭代器失效 | UB、崩潰、資料損毀 | 熟記各容器操作的失效規則;用索引或重新取得迭代器 |
| 刪除元素迴圈錯誤 | 跳過元素、存取已刪迭代器 | it = c.erase(it); 或 erase-remove idiom |
map::operator[] 側效應 | 鍵不存在時預設建構插入 | 查找用 find() 或 at() (C++11) |
| 自訂比較函數不嚴格弱序 | set/map 行為未定義 | 確保 !(a 等價、可傳遞性 |
| 儲存多型物件切割 | 衍生部分丟失 | 儲存 std::unique_ptr 或 std::shared_ptr |
STL 是 C++ 標準程式庫的皇冠明珠,掌握「容器選擇、演算法應用、迭代器契約」三位一體核心,配合移動語意、智慧指標、constexpr 等現代特性,能讓你寫出高效、安全、可維護的現代 C++ 程式碼。持續精進,享受泛型程式設計的優雅與力量!