30
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

C++で多次元配列の初期化方法。std::fill()の便利な使い方

Last updated at Posted at 2016-02-04

以下のように、テンプレートを用いた関数を定義すると楽に初期化できます。

// 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 );

参考

C++で多次元配列を一行で初期化
C++で静的配列の要素数を取得する

30
23
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
30
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?