[Work/Class/C++11の場合/CPPBasic]

C++11の場合 - 範囲for文

範囲for文

Java7でやった拡張for文や,Pythonのlist, arrayを与えるfor文のC++版である.

#include <iostream>

int main(){
  // 拡張for文を静的確保した配列で使う
  int static_array[5] = {1, 2, 3, 4, 5};
  for(auto& item: static_array)
    std::cout << item << std::endl;
  return 0;
}

という形で使う.Java拡張for文やpythonのfor文まんまである.

ちなみにstd::cout << 出力したい変数や文字列 << std::endl;は,printf()関数の代わりに使える.

printf関数では,必ず出力する値の型が明確になっていなければならない(print("%d", int型の変数);など)が,autoを使っていることからわかるように,std::coutはどんな型でも<<で連結して出力することができる.(JavaのSystem.out.println関数内つまりStringで,「+」を使って文字列や変数を連結していくのと同じだと捉えるとよい.正確には演算子のオーバーロードを使って実装されている.)

例えばfor文でstd::endl;を書かないまま回して,for文のループが終了してからstd::out << std::endl;とすれば,行の出力が命令文をまたぐこともできる.

std::vector

ついでなので,可変長配列std::vectorもやっておく.

JavaでいうところのArrayListに相当する.

std::vector<収納する型> vectorの変数名;

で空の配列(要素0)を宣言し,

vectorの変数名.push_back(追加する要素)

で末尾に要素(この場合はint型の数)を追加していく.

もともと範囲for文は,このstd::vectorのために作られたもので,非常に簡単に回すことができる.(JavaのArrayListと拡張for文の組み合わせと同じように使える)

#include <iostream>
#include <vector>

int main(){
  // 可変長配列std::vectorで範囲for文を使う
  int numOfElements = 20;
  std::vector<int> dynamic_array;  
  for(int i=0; i<numOfElements; i++){
    dynamic_array.push_back(rand());
  }

  for(auto& item: dynamic_array)
    std::cout << item << ",";
  std::cout << std::endl;
  return 0;
}

std::vectorの詳しい説明は,STLのCollectionの項で行う.