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

C++ vector 迭代器 iterator 完整入門教學:操作、分類與失效規則

     編輯:關於C語言

為什麼用迭代器?

  • 統一介面:所有標準容器皆提供 iterator,演算法 (STL ``) 以迭代器為參數,實現容器與演算法解耦。
  • 部分容器 (list, map, set) 不支援下標存取,迭代器是通用遍歷方式。
  • 語意清晰:begin()/end() 表達「範圍」概念,配合範圍-based for (C++11) 更簡潔。

vector 迭代器核心操作

操作說明範例
宣告vector<T>::iterator it;vector<int>::iterator it = vec.begin();
解參考*it 存取元素cout << *it;
前置遞增++it 指向下一元素for (it = vec.begin(); it != vec.end(); ++it)
後置遞增it++ (效率稍低)同上
比較==, !=it != vec.end()
算術it + n, it - n, it1 - it2 (隨機存取迭代器特有)auto mid = vec.begin() + vec.size()/2;

關鍵特性

  1. begin() 指向第一個元素,end() 指向「最後一個元素之後」的虛擬位置 (past-the-end),不可解參考。
  2. 空容器 begin() == end()。
  3. 任何改變 vector 長度的操作 (push_back, insert, erase, resize, reserve 導致重新分配) 都會使所有現有迭代器失效。

const_iterator 與 const 迭代器

  • vector<T>::const_iterator:指向 const T,只能讀取元素,迭代器本身可修改 (可遞增)。
  • const vector<T>::iterator it:迭代器本身為常量 (不可遞增),但指向元素可修改。極少使用。
  • cbegin()/cend() (C++11) 直接回傳 const_iterator。

範圍-based for (C++11 推薦寫法)

for (const auto &elem : vec) { /* 唯讀 */ }
for (auto &elem : vec) { /* 可修改 */ }

編譯器自動轉換為迭代器循環,程式碼最簡潔、不易出錯。

常見錯誤與避坑

  1. 使用失效迭代器:vec.push_back(x); 後繼續用舊 it → 未定義行為。
  2. erase 迴圈未正確更新迭代器:it = vec.erase(it); (C++11 回傳下一有效迭代器)。
  3. 混用 signed/unsigned 比較:vec.size() 回傳 size_t,迴圈變數宜用 size_t 或 auto。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved