STL (Standard Template Library) 是 C++ 標準庫的核心,提供容器、演算法、迭代器三大支柱,並以泛型程式設計為基礎,實現「資料結構與演算法分離」的設計哲學。本文系統梳理 STL 核心架構、五大迭代器分類、概念與模型、仿函數與配置器,幫助開發者建立完整心智模型。
| 支柱 | 核心角色 | 代表類別 |
|---|---|---|
| 容器 | 管理資料儲存與生命週期 | vector, list, deque, set, map, unordered_map |
| 演算法 | 操作資料的通用邏輯(排序、搜尋、變換) | sort, find, copy, transform, for_each |
| 迭代器 | 連接容器與演算法的抽象介面 | iterator, reverse_iterator, back_insert_iterator |
vector (隨機存取、尾端增刪快)、list (雙向鏈表、任意位置 O(1) 插刪)、deque (雙端隊列、支援隨機存取)。set/multiset (有序唯一/可重複鍵值)、map/multimap (鍵值對)、底層為紅黑樹,操作 O(log n)。unordered_set/map,哈希表實作,平均 O(1)。stack, queue, priority_queue 封裝底層容器提供特定介面。迭代器是指標的廣義化,演算法依賴迭代器類別而非具體容器,實現解耦。
Input Iterator (單向、單次讀取) → istream_iterator
↓ refinement
Forward Iterator (單向、多次讀取) → forward_list::iterator
↓ refinement
Bidirectional Iterator (雙向) → list::iterator, set::iterator
↓ refinement
Random Access Iterator (隨機存取) → vector::iterator, deque::iterator, pointer
Output Iterator (單向、單次寫入) → ostream_iterator, back_insert_iterator
--、+n)。find 只需 Input Iterator;reverse 需 Bidirectional;sort 需 Random Access。STL 文件使用概念描述類型需求(非 C++ 語法實體)。例如 InputIterator 概念要求:可解參考 (*it)、可遞增 (++it)、可比較 (==/!=)。滿足該概念的具體類型(如 int*, vector<int>::iterator)稱為該概念的模型。
優點:演算法作者只需對概念編程,使用者只需確認傳入類型為模型,即可任意組合容器與演算法。
// 一元仿函數
struct Square { int operator()(int x) const { return x*x; } };
// 二元仿函數
struct Add { int operator()(int a, int b) const { return a+b; } };
// 搭配演算法
transform(v.begin(), v.end(), v.begin(), Square());
sort(v.begin(), v.end(), greater<int>()); // 標準庫內建仿函數
std::allocator<T>。vector,除非有明確效能理由選擇 list/deque。for (auto& x : v)。begin/end 非成員函式 (C++14),支援陣列與容器統一介面。vector 擴容導致所有迭代器失效)。STL 不只是容器集合,更是一套以概念為契約、迭代器為介面、演算法為操作的泛型程式設計框架。深入理解五大迭代器分類、概念/模型機制、仿函數與配置器角色,才能在複雜專案中靈活組合、撰寫高效且可維護的現代 C++ 程式碼。