範囲ベースの for ステートメント (C++)
expression 内の各要素に対して statement を繰り返し順番に実行します。
for ( for-range-declaration : expression )
statement
解説
範囲ベースの for ステートメントを使用して、"範囲" を通じて実行する必要があるループを構築します。これは反復処理できるもの (たとえば、begin() および end() によって範囲が定義される std::vector やその他の STL シーケンス) として定義されます。 for-range-declaration の部分で宣言された名前は for ステートメントに対してローカルであり、expression または statement で再宣言することはできません。 auto キーワードはステートメントの for-range-declaration の部分で推奨されることに注意してください。
このコードは、for ループを使用し、配列とベクターを通じて反復処理する方法を示します:
// range-based-for.cpp
// compile by using: cl /EHsc /nologo /W4
#include <iostream>
#include <vector>
using namespace std;
int main()
{
// Basic 10-element integer array.
int x[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// Range-based for loop to iterate through the array.
for( int y : x ) { // Access by value using a copy declared as a specific type.
// Not preferred.
cout << y << " ";
}
cout << endl;
// The auto keyword causes type inference to be used. Preferred.
for( auto y : x ) { // Copy of 'x', almost always undesirable
cout << y << " ";
}
cout << endl;
for( auto &y : x ) { // Type inference by reference.
// Observes and/or modifies in-place. Preferred when modify is needed.
cout << y << " ";
}
cout << endl;
for( const auto &y : x ) { // Type inference by reference.
// Observes in-place. Preferred when no modify is needed.
cout << y << " ";
}
cout << endl;
cout << "end of integer array test" << endl;
cout << endl;
// Create a vector object that contains 10 elements.
vector<double> v;
for (int i = 0; i < 10; ++i) {
v.push_back(i + 0.14159);
}
// Range-based for loop to iterate through the vector, observing in-place.
for( const auto &j : v ) {
cout << j << " ";
}
cout << endl;
cout << "end of vector test" << endl;
}
出力を次に示します。
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
end of integer array test
0.14159 1.14159 2.14159 3.14159 4.14159 5.14159 6.14159 7.14159 8.14159 9.14159
end of vector test
範囲ベースの for ループは、statement 内の break、return、または goto (範囲ベースの for ループの外側のラベルが付いたステートメントに対する) が実行されると終了します。 範囲ベースの for ループ内の continue ステートメントは、現在のイテレーションのみを終了します。
範囲ベースの for について、以下の点に注意してください。
自動的に配列を認識します。
.begin() と .end() を持つコンテナーを認識します。
それ以外については begin() および end() の引数依存の参照を使用します。