iterator の役割

これは,C++プログラマであるかを見分ける10の質問 - Life like a clown の 「iterator の役割について説明せよ」 と言う質問に対する回答的な記事です.iterator の詳細については Iterator library - cppreference.com 辺りを参照してもらうとして,ここでは「なぜ iterator と言うものが存在しているのか?」と言う iterator の役割の観点から記述します.

iterator の役割については,Boost.勉強会 #3 での id:Cryolite (@Cryolite) の発表資料(の前半部分)が分かりやすいので引用します.


iterator の役割は「データ構造とアルゴリズムの橋渡し(インターフェース)」になります.C++ は,iterator と言うインターフェースが定義されている事によって, データ構造とアルゴリズムをうまく分離する事に成功しています.

ユーザは,データ構造であればそのデータ構造を走査する iterator を定義する事によって,アルゴリズムであれば各 iterator に対する処理を記述することによって,既に存在する他の(iterator ベースの)アルゴリズムやデータ構造を再利用することができます.

この質問を一番最初に持ってきた理由は,iterator の役割を認識していない人と C++ のコードを共有した場合,「STL の <algorithm> を使ったら『お前の書くコードは可読性が低い.俺にも初心者にも分かるように書け』と言われた.な,何を(ry」と言うホラーな状況が割と発生するので,事前にその状況を回避するためだったりします.

std::vector<std::string> v;
v.push_back("hello, world!");
v.push_back("foo");
...

// index で各要素にアクセス
for (std::size_t i = 0; i < v.size(); ++i) {
    do_something(v[i]);
}

// iterator で各要素にアクセス
for (std::vector<std::string>::iterator pos = v.begin(); pos != v.end(); ++post) {
    do_something(*pos);
}

実際,上記のような(サンプルコードとしてよく見かける)コードだけだと iterator の存在意義がイマイチよく分からないと言う人も多そうなので,iterator の役割と言うか存在意義について問うてみるのは大切かなと思います.もっと直球に「<algorithm> 使ってる?」とかでも良いかもしれませんが.

iterator に関しては「begin/end をペアで書くのがめんどくさい」と言う切実な問題によって,これに変わるインターフェースとして range が議論され,いくつかのライブラリが実装されています.将来的には,一番外側のインターフェースとしては,これに取って代わられるかもしれません.