指針天然支援陣列遍歷(ptr++ 移動到下一元素),但鏈表、樹等非連續結構無法用指針算術遍歷。迭代器 將指針行為抽象為類,統一了「解引用 *it」、「遞增 ++it」、「比較 it1 == it2」等操作,使演算法能以相同介面處理任意容器。
能力遞增:輸入 → 輸出 → 前向 → 雙向 → 隨機存取,後者包含前者所有操作。
| 類別 | 核心操作 | 典型容器 | 適用演算法 |
|---|---|---|---|
| Input Iterator | 單向單讀 ++it, *it, == | istream | find, accumulate |
| Output Iterator | 單向單寫 ++it, *it = val | ostream | copy, fill |
| Forward Iterator | 可多遍歷,單向 ++ | forward_list | replace, unique |
| Bidirectional Iterator | 雙向 ++/-- | list, set, map | reverse, sort(需隨機) |
| Random Access Iterator | it+n, it-n, it[n], <, > | vector, deque, array | sort, binary_search, nth_element |
iterator_traits<Iter> 提供統一介面獲取:
value_type, difference_type, pointer, reference, iterator_category。演算法據此選擇最優實現(如 advance 在隨機存取用 +=,雙向用循環 ++)。
cbegin()/cend() 或 const_iterator。for (auto& x : v) 實際調用 begin()/end(),C++11 起支援。std::iterator<Category, T>(C++17 棄用)或直接定義五個嵌套類型,實現必要操作符。
Input → Forward → Bidirectional → Random Access
↘
Output → (無直接繼承)
理解層級關係有助於編寫泛型演算法時對模板參數施加正確約束(如 requires RandomAccessIterator<Iter>)。