STL 由三大核心組件構成,透過迭代器解耦,實現「容器與演算法互不相識」的極致泛化:
std::vector<int> v = {3,1,4,1,5};
std::sort(v.begin(), v.end()); // 演算法只需迭代器對,不關心容器型別
std::list<int> l = {3,1,4,1,5};
std::sort(l.begin(), l.end()); // 錯誤:list 迭代器非隨機存取,編譯期失敗
迭代器分類編碼了容器能力,演算法透過 iterator_traits 靜態斷言需求,實現編譯期安全。
| 類別 | 容器 | 特性 | 適用場景 |
|---|---|---|---|
| 序列式 | vector | 連續記憶體、隨機存取、尾端增刪 O(1) | 預設首選、需快速索引 |
| list | 雙向鏈表、任意位置增刪 O(1)、無隨機存取 | 頻繁中間插刪、穩定迭代器 | |
| 關聯式 | map/set | 紅黑樹、有序、查找/插入/刪除 O(log n) | 鍵值對映射、有序集合 |
| unordered_map/set | 哈希表、無序、平均 O(1) | 高頻查找、不需有序 | |
| 容器配接器 | stack/queue/priority_queue | 封裝底層容器(預設 deque/vector) | 特定存取模式(LIFO/FIFO/優先權) |
標準演算法接受 [first, last) 半開區間:
// 複製 v 所有元素到 l
std::copy(v.begin(), v.end(), std::back_inserter(l));
// 尋找第一個滿足條件的元素
auto it = std::find_if(v.begin(), v.end(), [](int x){ return x > 3; });
std::less、std::greater、Lambda)。std::bind、std::not_fn、std::mem_fn 組合現有可呼叫物件。std::stack、std::queue 修改容器介面語意。value_type、iterator、size_type 等。++、*、==、+n (隨機存取)。iterator_traits 取得特性標籤。違背慣例 = 放棄 STL 生態互操作性。