iterator,演算法 (STL `begin()/end() 表達「範圍」概念,配合範圍-based for (C++11) 更簡潔。| 操作 | 說明 | 範例 |
|---|---|---|
| 宣告 | 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; |
begin() 指向第一個元素,end() 指向「最後一個元素之後」的虛擬位置 (past-the-end),不可解參考。begin() == end()。push_back, insert, erase, resize, reserve 導致重新分配) 都會使所有現有迭代器失效。vector<T>::const_iterator:指向 const T,只能讀取元素,迭代器本身可修改 (可遞增)。const vector<T>::iterator it:迭代器本身為常量 (不可遞增),但指向元素可修改。極少使用。cbegin()/cend() (C++11) 直接回傳 const_iterator。for (const auto &elem : vec) { /* 唯讀 */ }
for (auto &elem : vec) { /* 可修改 */ }
編譯器自動轉換為迭代器循環,程式碼最簡潔、不易出錯。
vec.push_back(x); 後繼續用舊 it → 未定義行為。erase 迴圈未正確更新迭代器:it = vec.erase(it); (C++11 回傳下一有效迭代器)。signed/unsigned 比較:vec.size() 回傳 size_t,迴圈變數宜用 size_t 或 auto。