範囲for

6415 ワード

1、範囲forはC++11の新しい特性で、文法は以下の通りです.
for(declaration:expression)
	statement;
  • 範囲for反復の範囲は決定され、使用中に下付きスケールが境界を越えることを心配する必要はない.
  • は、begin()メソッドおよびend()メソッドを定義し、反復器のクラスオブジェクトを返すメソッドを巡回することができる.STLのvector,set,list,map,queue,deque,stringなどのオブジェクト.
  • は、newを用いて生成する配列のようにポインタに使用できない範囲for)
  • である.
  • 配列はループ時にポインタに変換されるため、多次元配列をループする際には最内層ループを除いて、他のすべてのループの制御変数が参照形式を使用します.

  • 2、一次元配列における応用
    int arr1[] = { 10,20,3,4,5,6,8,9 };
    //         
    for (auto &i : arr1)
    	cout << i << " ";
    cout << endl;
    
    
    int *arr2 = new int[10];
    //   :  arr2     int* ,    int*         。
    for (auto &j : arr2)
    {
    	cout << j << " ";
    }
    
    

    3、多次元配列における応用
    int arr[2][3] = { {1,2,3},{4,5,6} };
    
    //   :             col         。
    for (auto &row : arr)
    	for (auto &col : row)
    		cout << col << " ";
    

    上の外層ループ制御変数rowを参照タイプとして宣言するのは、配列が自動的にポインタに変換されないようにするためである.参照タイプを使用しない場合、ループは次のようになります.
    //   :                
    for (auto row : arr)
    	for (auto col : row)
    		cout << col << " ";
    

    このプログラムはコンパイルできません.最初のループはarrのすべての要素を遍歴するため、これらの要素は実際には1つのサイズが3の配列である.row変数は参照タイプではないので、コンパイラはrow変数を初期化すると、これらの配列形式の要素を自動的にその配列内の最初の要素を指すポインタに変換します.このようにして得られるrowタイプがint*であり,このとき内層サイクルは合法的ではない.
    4、string、vector等の容器への応用
    string str("this is just a test !");
    for (auto i : str)
    {
    	cout << i << " ";
    }