イテレータ: コンテナの橋渡し
STL アルゴリズムとコンテナを繋ぐ抽象化層。
イテレータ
コンテナ要素を指すポインタ風オブジェクト。
begin/end
先頭/末尾の次を返す。
rbegin/rend
逆順イテレータ。
イテレータとは?
イテレータを使えば、配列でもリストでもマップでも、「次の要素へ進む」という統一された操作で扱えます。これにより、アルゴリズム(ソートや検索)を特定のコンテナに依存せずに書くことができます。
#include <vector>#include <iterator>
std::vector<int> v = {1, 2, 3, 4, 5};
// begin/endfor (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);}カテゴリ
// イテレータのカテゴリ// 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文が使えるカスタムクラスを作成してください。