---
# System prepended metadata

title: 【3-6】迭代器

---

# 【3-6】迭代器

迭代器（Iterator）是 STL（標準模板庫）中好用的工具，它就像是「智慧指標」，可以幫助我們在容器中「逐個」走訪元素，不需要自己寫繁瑣的 index 操作。

目前學到的 STL 容器只有 `vector`，之後會介紹更多。

## 迭代器（Iterator）

### 宣告
```cpp
vector<int>::iterator it    // 宣告迭代器 it
```
### 移動
```cpp
it++    // 迭代器向前一格
++it    // 迭代器向前一格

it--    // 迭代器向後一格
--it    // 迭代器向後一格
```
### 常用迭代器
```cpp
v.begin()    // v陣列的起點
v.end()      // V陣列的終點
*it          // 取得目前指向的值
```

### 遍歷陣列

宣告一個迭代器 `it`，從容器 `v` 的 `begin()` 遍歷到 `end()`。

```cpp=1
#include <bits/stdc++.h>
using namespace std;

int main() {
    vector<int> v={1,2,3,4,5};
    for(vector<int>::iterator it=v.begin();it!=v.end();it++){
        cout << *it << " ";
    }
    
    return 0;   
}
```
### 輸出結果
```
1 2 3 4 5
```

## auto
`auto` 是一種透過編譯器來自動推測變數型態的關鍵字，好處是可以化簡代碼。

剛才的代碼可以被化簡成這個樣子，主要差別就在宣告的方式，因為 `v.begin()` 是一個迭代器，所以編譯器就會自動將 `auto` 視為在宣告迭代器。

```cpp=1
#include <bits/stdc++.h>
using namespace std;

int main() {
    vector<int> v={1,2,3,4,5};
    for(auto it=v.begin();it!=v.end();it++){
        cout << *it << " ";
    }
    
    return 0;   
}
```
### 輸出結果
```
1 2 3 4 5
```
## range-based

如果確定要遍歷整個容器，我們可以這樣寫：

```cpp=1
#include <bits/stdc++.h>
using namespace std;

int main() {
    vector<int> v={1,2,3,4,5}; // 宣告一個容器 v
    for(auto it : v){ // 宣告一個迭代器 it，自動從頭開始遍歷容器 v
        cout << *it << " ";
    }
    
    return 0;   
}
```
### 輸出結果
```
1 2 3 4 5
```
好的，我幫你寫一份【3-6】迭代器的 Python 對照版，並且解釋差異和用法，整篇整理如下，方便你複製貼上：

---

# 【3-6】迭代器

迭代器（Iterator）是 STL（標準模板庫）中好用的工具，它就像是「智慧指標」，可以幫助我們在容器中「逐個」走訪元素，不需要自己寫繁瑣的 index 操作。

目前學到的 STL 容器只有 `vector`，之後會介紹更多。

## 迭代器（Iterator）

### 宣告

```cpp
vector<int>::iterator it    // 宣告迭代器 it
```

### 移動

```cpp
it++    // 迭代器向前一格
++it    // 迭代器向前一格

it--    // 迭代器向後一格
--it    // 迭代器向後一格
```

### 常用迭代器

```cpp
v.begin()    // v陣列的起點
v.end()      // v陣列的終點
*it          // 取得目前指向的值
```

### 遍歷陣列

宣告一個迭代器 `it`，從容器 `v` 的 `begin()` 遍歷到 `end()`。

```cpp=1
#include <bits/stdc++.h>
using namespace std;

int main() {
    vector<int> v={1,2,3,4,5};
    for(vector<int>::iterator it=v.begin();it!=v.end();it++){
        cout << *it << " ";
    }
    
    return 0;   
}
```

### 輸出結果

```
1 2 3 4 5
```

## auto

`auto` 是一種透過編譯器來自動推測變數型態的關鍵字，好處是可以化簡代碼。

剛才的代碼可以被化簡成這個樣子，主要差別就在宣告的方式，因為 `v.begin()` 是一個迭代器，所以編譯器就會自動將 `auto` 視為在宣告迭代器。

```cpp=1
#include <bits/stdc++.h>
using namespace std;

int main() {
    vector<int> v={1,2,3,4,5};
    for(auto it=v.begin();it!=v.end();it++){
        cout << *it << " ";
    }
    
    return 0;   
}
```

### 輸出結果

```
1 2 3 4 5
```

## range-based

如果確定要遍歷整個容器，我們可以這樣寫：

```cpp=1
#include <bits/stdc++.h>
using namespace std;

int main() {
    vector<int> v={1,2,3,4,5}; // 宣告一個容器 v
    for(auto it : v){ // 宣告一個迭代器 it，自動從頭開始遍歷容器 v
        cout << it << " ";  // C++ 這裡其實是直接取得元素本身，不用再解引用 *
    }
    
    return 0;   
}
```

### 輸出結果

```
1 2 3 4 5
```

### Python 對照及說明

Python 也有迭代器（Iterator）這個概念，但用法比較隱式和簡化，不像 C++ 需要手動宣告迭代器或移動指標。

### 宣告與使用迭代器

Python 內建容器（如 list、tuple、dict 等）本身就是可迭代物件，可以直接用 `for` 迴圈遍歷：

```python
v = [1, 2, 3, 4, 5]

for it in v:
    print(it, end=' ')
```

輸出：

```
1 2 3 4 5
```

### 手動建立迭代器物件

如果想模擬 C++ 明確的迭代器宣告與操作，可以用 `iter()` 取得迭代器物件，再用 `next()` 逐步取出：

```python
v = [1, 2, 3, 4, 5]
it = iter(v)  # 取得迭代器物件

print(next(it))  # 1
print(next(it))  # 2
print(next(it))  # 3

# 也可以用 try-except 捕捉 StopIteration 來避免超出範圍錯誤
try:
    while True:
        print(next(it), end=' ')
except StopIteration:
    pass
```

但原則上，Python 很少去講迭代器，都是直接使用 `for` 迴圈。

---

聯絡方式：codecodefunny@gmail.com
最後編修時間：2025/07/10 子柚筆