range-based for ループ
概要
C++03で、コンテナの各要素に対して処理をするループを記述しようとした場合、冗長な記述を強いられていた。 そこで、C++11ではJava言語などにあるような for(変数名 : 式) の構文が新規追加された。これを Range-based (for) loopと呼ぶ。
この構文を使用するとvectorに対するループを以下のように記述できる。
std::vector<int> v{1, 2, 3, 4, 5};
for(const int i : v) {
std::cout << i << std::endl;
}
上記の変数の宣言を参照型にすることで、コンテナの各要素を変更することもできる。
std::vector<int> v{1, 2, 3, 4, 5};
for(int& i : v) {
i *= 2;
}
この Range-based for loop の構文は、コロンに続く式の型が以下の場合に適用できる。
- 配列型 ※ 但し、配列のサイズが不明、もしくは不完全な型の配列の場合は ill-formed
- クラス型、かつアクセス可能な begin(), end() のメンバ関数が定義されている
- 上記以外で、begin(式), end(式) として適用できる型 ※ begin, endの非メンバ関数が定義されている