イテレータ: コンテナの橋渡し

STL アルゴリズムとコンテナを繋ぐ抽象化層。

イテレータ
コンテナ要素を指すポインタ風オブジェクト。
begin/end
先頭/末尾の次を返す。
rbegin/rend
逆順イテレータ。

イテレータとは?

本のしおり (Bookmark)

コンテナが「本」なら、イテレータは「しおり」です。しおりは現在読んでいるページ(要素)を指し示します。しおりを1ページ進める(++it)ことは簡単ですが、しおり自体は本の内容(データ)ではありません。

イテレータを使えば、配列でもリストでもマップでも、「次の要素へ進む」という統一された操作で扱えます。これにより、アルゴリズム(ソートや検索)を特定のコンテナに依存せずに書くことができます。

Basic Iterator
#include <vector>
#include <iterator>
std::vector<int> v = {1, 2, 3, 4, 5};
// begin/end
for (auto it = v.begin(); it != v.end(); ++it) {
std::cout << *it << " "; // デリファレンス
}
// 逆イテレータ
for (auto rit = v.rbegin(); rit != v.rend(); ++rit) {
std::cout << *rit << " "; // 5 4 3 2 1
}
// const イテレータ
for (auto cit = v.cbegin(); cit != v.cend(); ++cit) {
// *cit = 10; // エラー: 変更不可
}
実行結果
v.begin() → *it = 1\nfor: 1 2 3 4 5\nrbegin: 5 4 3 2 1
Bad
// ❌ Bad: インデックスアクセス(範囲チェックなし)
for (int i = 0; i <= v.size(); ++i) { // off-by-one!
process(v[i]);
}
Good
// ✅ Good: 範囲for文
for (const auto& elem : v) {
process(elem);
}

カテゴリ

Iterator Categories
// イテレータのカテゴリ
// Input: 読み取り専用、前進のみ
// Output: 書き込み専用、前進のみ
// Forward: 読み書き、前進のみ
// Bidirectional: 双方向移動 (list, map)
// RandomAccess: ランダムアクセス (vector, deque)
// イテレータ操作
std::advance(it, 3); // 3つ進める
auto dist = std::distance(v.begin(), v.end()); // 距離
auto next_it = std::next(it); // 次
auto prev_it = std::prev(it); // 前
Tip: 範囲for文を使えばイテレータを意識しなくてOK。

合格ライン

begin/end でループを書ける
イテレータカテゴリを説明できる

参考リンク

演習課題

課題1: イテレータでループ
begin/end を使ってvectorの要素を逆順に表示してください。
課題2: カスタムイテレータ
範囲for文が使えるカスタムクラスを作成してください。

次のステップ