範囲ベースの for ループ C++11
まず、range の基本的な構文です。
C++98 では、配列を走査する場合は、次の方法で実行できます。
#include<iostream>
using namespace std;
void TestFor()
{
int array[] = {
1, 2, 3, 4, 5 };
for (int i = 0; i < sizeof(array) / sizeof(array[0]); ++i)
cout << array[i] << " ";
cout << endl;
}
int main()
{
TestFor();
return 0;
}
範囲コレクションの場合、プログラマがループの範囲を指定するのは冗長であり、場合によってはエラーが発生しやすくなります。したがって、範囲ベースの for ループが C++11 で導入されました。
for ループの後の括弧は、コロン「:」によって 2 つの部分に分割されます。最初の部分は範囲内の反復に使用される変数で、2 番目の部分は反復される範囲を表します。
for ステートメントの範囲の定義を見てください。
for (宣言 : 式)
ステートメント
このうち、式部分はシーケンスであり、宣言部分はシーケンス内の基本要素にアクセスするために使用される変数を定義します。
コード例
#include<iostream>
using namespace std;
void TestFor2()
{
int array[] = {
1, 2, 3, 4, 5 };
//定义一个变量 e 然后每次都从array取数据赋值给e,自动判断结束
for (auto e : array)
e *= 2;
for (auto e : array)
cout << e << " ";
}
int main()
{
TestFor2();
return 0;
}
注: 通常のループと同様に、Continue を使用してこのループを終了するか、break を使用してループ全体から抜け出すことができます。
2. スコープ内で参照を使用する (いくつかの奇妙な問題)
上記のコードを読んだ後、範囲を使用して配列内の値を変更したい場合は、どうすればよいでしょうか? 実は扱いは簡単で、スコープ内の変数を参照型に変更するだけです。
例えば:
#include<iostream>
using namespace std;
void TestFor3()
{
int array[] = {
1, 2, 3, 4, 5 };
//定义一个变量 e 然后每次都从array取数据赋值给e,自动判断结束
for (auto& e : array)
{
e *= 2;
cout << e << " ";
}
}
int main()
{
TestFor3();
return 0;
}
これを見たとき、注意していれば、「参照変数 e はどのようにバインディングを変更できるのだろうか?」と考えるでしょう。実際、スコープ内の変数 e は反復ごとに再作成されるため、ここでの参照は連続的に初期化されます。
もちろん、for() ループには、ここでの変数 e と同じ方法で作成される別の例と、ここでの変数 e の作成方法とは異なる別の例があります。 ①
同じ
#include<iostream>
using namespace std;
int main()
{
int i = 0;
for (i = 0; i < 10; i++)
{
int a = 10;
cout << a << " ";
a++;
}
return 0;
}
これは、a がローカル変数であり、上記のスコープでの参照の使用と同様に、ループが再循環されるたびに a が再作成されるためです。
②
for() ループの初期化リストに作成された別の変数は、ループを再ループするたびに再作成されるわけではありませんが、 for() ループが終了すると、for() ループの初期化リストに作成された変数が再作成されます。も消えます。
#include<iostream>
using namespace std;
int main()
{
for (int i = 0; i < 10; i++)
{
cout << i << " ";
}
return 0;
}
議論
for の範囲での変数の作成は、上記の通常の for() ループの最初のメソッドに似ています。同じ方法で実装できます。私はこれについてあまり知りません。理解できる友人がいる場合は、コメントエリアで議論できます。
3. スコープの使用条件
- for ループ反復の範囲を決定する必要があります。
配列の場合、それは配列内の最初の要素と最後の要素の範囲です。クラスの場合、begin と end のメソッドが提供される必要があり、begin と end はfor ループ反復の範囲。
注: 次のコードには問題があります。関数は配列を渡さず、配列名が最初の要素のアドレスを表すため、for の範囲を決定できません。
void TestFor(int array[])
{
for(auto& e : array)
cout<< e <<endl;
}