Cpp 範囲に基づく for文

提供:yonewiki

C++に戻る


本来の表記は「C++(Cpp) 範囲に基づく for文 」です。この記事に付けられた題名はテンプレート:記事名の制約から不正確なものとなっています。

※このページではC++にのみ存在する機能として、記事タイトルがC++ 範囲に基づく for文 になっています。

範囲に基づく for文

 for文は、多くのプログラミング言語において繰り返し処理をするための基本的な構文で、for()の引数を ; セミコロンで区切る第一から第三までの指定をもつ構文です。一つ目は初期化の指定、2つめは条件式、3つめはステップ処理を記述し、2つめの条件式が真である間、for(…){}という表記において{}の部分に書かれた処理もしくは{}が無い場合は次の1つの命令文を繰り返し実行するものです。

 変数 iCnt が0から始まって、iCntが10以下の間 i を1ずつ増やしながら10回処理するfor文の使用例としては以下のようになります。

for(int i=10; i<10; i++){
    Cpp's statement...
}


 上記の構文は基本的なことなのであまり説明はしません。重要なのはここからです。C++のC++11から使えるようになった範囲に基づくfor文(範囲ベースfor文) ですが、これは他の言語ではよくforeach as という感じの命令が用意されていて、引数に与えられた配列の順序開始位置から終了位置までの要素を個別要素格納変数を使いながら、繰り返すという処理が採用されていてC++には無い技術でありながら便利だったものを取り入れたものです。古くらからC++言語を扱う人には理解しにくい構文です。for文をそのまま活用して以下のようにして使います。

for(auto& arg : argvUTF8Q){
    Cpp's statement...
}

 上記のように引数を一つしかとらない記述方法です。セミコロンによる区分けがありません。メンバ関数の初期化と同じような : コロンを使った初期化子で、配列あるいはIterator要素番号を使うオブジェクトを指定します。指定した値の最初から最後までを使った処理を繰り返す事を意味していて、その手前に書かれた変数が個別の値を受け取る変数になります。ここで初めて初期化される変数でもfor文内では有効になります。範囲for文とも呼びます。


 受け取る変数の型名はいわゆる推論で決められる型でよければautoを使えば良いです。ここでは参照型を指定しているので、argの値を書き換えると範囲指定のために用意した元の配列の中身を書き換える事も出来ます。


 構造化束縛という記述法を使って、範囲指定に使う配列から複数の値を設定するような指定もできます。


for(auto& [arg1, arg2, arg3] : {argvUTF8Q}){
    Cpp's statement...
}


 auto& [arg1, arg2, arg3]のように複数の値を一度に取得する構造化束縛は、戻り値を複数うけとるような処理にも使えます。[ ](ブラケット、角カッコ)で囲った部分が構造化束縛です。argvUTF8Qの中身は3要素以上の配列であるか、3つのメンバ変数をもつクラスのオブジェクトである必要があります。構造化束縛かつ範囲に基づくfor文である場合の配列は、ループ回数だけの要素をもつ1次元めの配列に、構造化束縛の要素数分だけの2次元目の配列を持つ2次元配列である必要があります。あるいは以下のように複数のオブジェクトを指定をした初期化子リストの配列である必要があります。


for(auto& [arg1, arg2, arg3] : {argvUTF8Q_0, argvUTF8Q_1, argvUTF8Q_2, argvUTF8Q_3}){
    Cpp's statement...
}

 

C++に戻る