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

C++ 迭代器完整指南:分類、操作與實戰範例

     編輯:C++ 入門

C++ Iterator 迭代器總覽

迭代器是 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 Iterator
  • list, set, multiset, map, multimap → Bidirectional Iterator
  • forward_list → Forward Iterator
  • 輸入/輸出流迭代器 → Input/Output Iterator

隨機存取迭代器擁有最完整功能,因此所有為較弱迭代器設計的演算法均可用於 vector 等容器。

常見操作實戰範例

1. 宣告與基本遍歷

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; // 編譯錯誤:不可修改
}

2. const_iterator vs const iterator 差異

vector::const_iterator citer = ivec.begin(); // 迭代器可變,元素不可變
// *citer = 11; // 錯誤
// ++citer;     // 正常

const vector::iterator citer2 = ivec.begin(); // 迭代器不可變,元素可變
*citer2 = 11; // 正常
// ++citer2;   // 錯誤:迭代器本身是 const

3. 迭代器算術運算(僅隨機存取)

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 位

4. 完整 STL 範例

#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 起) 可大幅簡化迭代器操作,減少錯誤。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved