以下のように、テンプレートを用いた関数を定義すると楽に初期化できます。
// n次元配列の初期化。第2引数の型のサイズごとに初期化していく。
template<typename A, size_t N, typename T>
void Fill(A (&array)[N], const T &val){
std::fill( (T*)array, (T*)(array+N), val );
}
使い方
int main(){
int a[10];
Fill( a, 12 ); // 配列aの中身がすべて12になる
int b[10][20];
Fill( b, 100 ); // 2次元でも同じ書き方
int c[10][20][30];
Fill( c, 100 ); // 何次元でもいける
long long d[20][20];
Fill( d, (long long)100 ); // 第2引数の型を配列の要素の型に合わせないとうまくいかない
int N = 10;
int e[N][2];
//Fill( e, 100 ); // エラー。動的に確保した配列には使えない
return 0;
}
何次元の配列に対しても同じ書き方ができるので、便利だと思います。
受け取った多次元配列を、第2引数の型の1次元配列にキャストして、初期化しています。
そのため、第1引数の配列の要素の型のサイズと、第2引数の型のサイズを揃えないとうまくいかないので注意が必要です。
memset()と同じように0と-1で初期化する場合は気にしなくて大丈夫です。
std:fill()だけを使う
std::fill()だけを使う場合は、以下のようにして初期化することもできます。
int a[10][20];
std::fill( a[0], a[10], 100 );
int b[10][20][30];
std::fill( b[0][0], b[10][0], 100 );
// ちなみに、上のFill()がやっていること
int array[10][20][30];
int val = 100;
std:fill( (int*)array, (int*)(array+10), val );