迭代器:統一容器存取抽象
現代 C++ 傾向使用迭代器而非下標存取容器元素,即使支援下標的 vector 亦然。標準庫為每種容器定義專屬迭代器型別,提供比下標更通用的方法:所有標準容器皆定義迭代器型別,僅少數支援下標。
容器的 iterator 型別
std::vector<int>::iterator iter; // 定義 vector 迭代器變數
每個標準容器定義名為 iterator 的成員型別。術語區分:
- 迭代器(概念):支援特定行為(遍歷、存取元素)的型別統稱。
- iterator 型別(具體):特定容器定義的具體型別,如
vector<int>::iterator。
begin() 與 end() 操作
begin():回傳指向第一個元素的迭代器。容器為空時與 end() 相同。
end():回傳指向尾後位置的迭代器,不指向實際元素,作為哨兵標記遍歷結束。
std::vector<int> ivec = {1,2,3};
auto iter = ivec.begin(); // 指向 1
// *iter 即 ivec[0]
迭代器核心操作
| 操作 | 語法 | 語義 |
| 解參考 | *iter | 存取迭代器指向的元素(可讀寫,視迭代器類別而定) |
| 前置遞增 | ++iter | 移動到下一個元素,回傳遞增後的迭代器 |
| 後置遞增 | iter++ | 移動到下一個元素,回傳遞增前的副本 |
| 相等比較 | iter1 == iter2 | 指向同一元素則為真 |
| 不等比較 | iter1 != iter2 | 指向不同元素則為真 |
注意:end() 回傳的迭代器不可解參考、不可遞增。
遍歷慣用法
// 傳統 for 迴圈
for (auto iter = vec.begin(); iter != vec.end(); ++iter) {
std::cout << *iter << ' ';
}
// C++11 範圍 for(推薦,自動使用迭代器)
for (const auto& elem : vec) {
std::cout << elem << ' ';
}
// 演算法配合迭代器
std::sort(vec.begin(), vec.end());
auto pos = std::find(vec.begin(), vec.end(), target);
迭代器分類(標籤)
標準庫定義五類迭代器標籤,功能遞增:
input_iterator_tag:單向唯讀(如 istream_iterator)
output_iterator_tag:單向唯寫(如 ostream_iterator)
forward_iterator_tag:單向讀寫、多遍(如 forward_list)
bidirectional_iterator_tag:雙向讀寫(如 list, map)
random_access_iterator_tag:隨機存取、算術運算(如 vector, deque, array)
演算法依迭代器類別要求不同功能(如 sort 需隨機存取迭代器)。
const 迭代器與常量正確性
const_iterator:指向 const 元素,不可修改元素值。
cbegin()/cend():回傳 const_iterator(C++11)。
- 範圍 for 自動推導
const 正確性。
- 上一篇文章: C++ 鏈結串列實作深度解析:節點交換演算法與完整代碼
- 下一篇文章: C++Test 工具全方位解析:靜態分析、白盒/黑盒測試、回歸與覆蓋率
Copyright ©
程式碼之家 All Rights Reserved