迭代器是 C++ STL 中連接容器與演算法的關鍵抽象,行為類似指標,可統一存取不同容器的元素。理解其分類與能力對編寫高效、泛用的程式碼至關重要。
| 迭代器類別 | 能力描述 | 支援操作 |
|---|---|---|
input_iterator | 單向唯讀 | ++, ==, !=, * (讀取) |
output_iterator | 單向唯寫 | ++, * (寫入) |
forward_iterator | 單向讀寫 | 繼承 input/output,可多次遍歷、儲存值 |
bidirectional_iterator | 雙向讀寫 | 繼承 forward,支援 -- |
random_access_iterator | 隨機存取 | 繼承 bidirectional,支援 +n, -n, [], <, > 等指標運算 |
reverse_iterator 為適配器,包裝雙向或隨機迭代器使其反向移動。
vector, deque, string, array → Random Access Iteratorlist, set, multiset, map, multimap → Bidirectional Iteratorforward_list → Forward Iterator隨機存取迭代器擁有最完整功能,因此所有為較弱迭代器設計的演算法均可用於 vector 等容器。
vector ivec(10, 1);
// 可修改元素的迭代器
for (vector::iterator iter = ivec.begin(); iter != ivec.end(); ++iter) {
*iter = 2; // 解引用修改元素
}
// 唯讀迭代器
for (vector::const_iterator citer = ivec.begin(); citer != ivec.end(); ++citer) {
cout << *citer; // *citer = 3; // 編譯錯誤:不可修改
}
const_iterator vs const iterator 差異vector::const_iterator citer = ivec.begin(); // 迭代器可變,元素不可變
// *citer = 11; // 錯誤
// ++citer; // 正常
const vector::iterator citer2 = ivec.begin(); // 迭代器不可變,元素可變
*citer2 = 11; // 正常
// ++citer2; // 錯誤:迭代器本身是 const
vector::iterator it1 = ivec.begin();
vector::iterator it2 = ivec.end();
cout << (it2 - it1) << endl; // 兩迭代器相減得距離 (10)
auto it3 = it1 + 3; // 向前位移 3 位
auto it4 = it2 - 2; // 向後位移 2 位
#include
#include
using namespace std;
int main() {
vector ivec;
ivec.push_back(1);
ivec.push_back(2);
ivec.push_back(3);
ivec.push_back(4);
// 範圍 for (C++11) 更簡潔
for (auto &val : ivec) cout << val << ' ';
cout << endl;
// 傳統迭代器寫法
for (vector::iterator iter = ivec.begin(); iter != ivec.end(); ++iter)
cout << *iter << endl;
// 手動迭代器累加
vector the_vector;
for (int i = 0; i < 10; ++i) the_vector.push_back(i);
int total = 0;
for (auto it = the_vector.begin(); it != the_vector.end(); ++it)
total += *it;
cout << "Total=" << total << endl;
}
vector 迭代器不一定是原始指標(MSVC 實作為類別)。需回傳指標時用 &(*iter),但這破壞封裝,建議回傳 const T& 或 const T*。vector 插入/刪除可能導致所有迭代器失效;list/關聯式容器僅影響被刪除元素的迭代器。auto 與範圍 for:現代 C++ (C++11 起) 可大幅簡化迭代器操作,減少錯誤。