C++のイテレータ(Iterator)とは?STLコンテナを自在に操作する鍵
C++で vector
や map
などのSTLコンテナを扱う際に欠かせないのが「イテレータ(Iterator)」です。
イテレータは、コンテナの要素を順番にアクセスするためのポインタのような機能です。
この記事では、イテレータの基礎から実用例、種類や注意点まで、初心者にもわかりやすく解説します。
イテレータとは?
イテレータとは、STLコンテナ(vector, list, mapなど)の要素を順に走査するためのオブジェクトです。
ポインタのように使え、*
で値を取得し、++
で次の要素に進みます。
基本構文と使用例
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> nums = {10, 20, 30};
vector<int>::iterator it;
for (it = nums.begin(); it != nums.end(); ++it) {
cout << *it << " ";
}
return 0;
}
この例では、begin()
で最初の要素を、end()
で最後の次の位置を示し、イテレータを使って全要素にアクセスしています。
主な操作一覧
操作 | 意味 |
*it | 現在の要素の値を取得 |
++it | 次の要素へ進む |
--it | 前の要素へ戻る(双方向イテレータ) |
it == nums.end() | 末尾の次の位置と比較 |
範囲ベースfor文との違い
// C++11以降はこちらも使える
for (int n : nums) {
cout << n << " ";
}
範囲ベースfor文はイテレータを内部で使っており、簡潔に書きたいときに便利です。ただし、細かい制御が必要な場面では手動のイテレータが有効です。
mapのイテレータの例
#include <map>
map<string, int> scores = {{"Alice", 90}, {"Bob", 85}};
for (map<string, int>::iterator it = scores.begin(); it != scores.end(); ++it) {
cout << it->first << ": " << it->second << endl;
}
map
では->first
でキー、->second
で値を取得します。
イテレータの種類
- 入力イテレータ:読み取り専用
- 出力イテレータ:書き込み専用
- 前方イテレータ:前にのみ進める
- 双方向イテレータ:前後に移動可能(例:list)
- ランダムアクセスイテレータ:配列のように直接アクセス可(例:vector)
イテレータのメリット
- コンテナに依存せず操作できる
vectorでもlistでも同じように扱える。
- STLアルゴリズムと連携しやすい
sort
, find
, copy
など。
- 柔軟な走査が可能
部分的なループや、逆順の処理などに対応。
注意点
- イテレータが無効になるケース(要素の削除後など)に注意。
- ポインタに似ているが、同じではない(ポインタ演算は制限される)。
まとめ
C++のイテレータは、STLコンテナを自在に操作するための鍵です。
ポインタに似た文法で、配列のようにデータを1つずつ処理できます。
まずはvector
やmap
で基本的な使い方に慣れ、STLアルゴリズムと組み合わせて活用していきましょう!