首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

STL 迭代器核心概念與五大類別詳解

     編輯:C++ 入門

從指針到迭代器的泛化

指針天然支援陣列遍歷(ptr++ 移動到下一元素),但鏈表、樹等非連續結構無法用指針算術遍歷。迭代器 將指針行為抽象為類,統一了「解引用 *it」、「遞增 ++it」、「比較 it1 == it2」等操作,使演算法能以相同介面處理任意容器。

五種迭代器分類與能力階層

能力遞增:輸入 → 輸出 → 前向 → 雙向 → 隨機存取,後者包含前者所有操作。

類別核心操作典型容器適用演算法
Input Iterator單向單讀 ++it, *it, ==istreamfind, accumulate
Output Iterator單向單寫 ++it, *it = valostreamcopy, fill
Forward Iterator可多遍歷,單向 ++forward_listreplace, unique
Bidirectional Iterator雙向 ++/--list, set, mapreverse, sort(需隨機)
Random Access Iteratorit+n, it-n, it[n], <, >vector, deque, arraysort, binary_search, nth_element

迭代器特徵萃取

iterator_traits<Iter> 提供統一介面獲取:
value_type, difference_type, pointer, reference, iterator_category。演算法據此選擇最優實現(如 advance 在隨機存取用 +=,雙向用循環 ++)。

常見陷阱與最佳實踐

  • 失效規則:vector/deque 插刪可能導致所有迭代器失效;list/set/map 僅被刪元素迭代器失效。
  • const 正確性:唯讀遍歷用 cbegin()/cend() 或 const_iterator。
  • 範圍 for 底層:for (auto& x : v) 實際調用 begin()/end(),C++11 起支援。
  • 自定義迭代器:繼承 std::iterator<Category, T>(C++17 棄用)或直接定義五個嵌套類型,實現必要操作符。

圖示:迭代器層級關係

Input  → Forward → Bidirectional → Random Access
              ↘
Output  → (無直接繼承)

理解層級關係有助於編寫泛型演算法時對模板參數施加正確約束(如 requires RandomAccessIterator<Iter>)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved