STL で配列の値を初期化する - C++ プログラミング

PROGRAM


配列の値を初期化する

C++ の STL (Standard Template Library) には、配列の要素を一定の値で埋める std::fill という関数が用意されています。

std::fill(first, last, value);

このように使うことで、first から last のひとつ手前までの範囲の要素に value の値を代入します。

 

また、同様の関数として std::fill_n も用意されています。

std::fill(first, size, value);

こちらは、first から始まる size 個の要素に value の値を代入します。

 

配列の値の初期化であれば、わざわざ STL を使わずに for ループを使って簡単に記載できますけど、今回の方法を使った方が、プログラムの記載に意味を持たせることができるので、コードの可読性が高まります。

 

C 配列で使用する

たとえば int 型の要素 100 個を格納できる配列 array があったとき、その値を 5 で初期化する場合は、次のようにします。

std::fill(array, array + 100, 5);

このように、first には配列の "先頭アドレス" を指定します。

last には配列の "最後のアドレス + 1" を指定しますが、先頭アドレスに要素数を足したものと覚えた方が覚えやすいかもしれません。

 

ただし、このような考え方の場合は std::fill_n を使った方が自然に書けます。

std::fill_n(array, 100, 5);

 

std::vector で使用する

ちなみに STL には std::vector<T> などの動的配列がありますが、ここで取得できるイテレータもポインタと互換性があるので、この std::fill 関数や std::fill_n 関数をそのまま利用できます。

std::fill(vector.begin(), vector.end(), value);

std::fill_n(vector.begin(), vector.size(), value);

どちらを使っても大丈夫です。

 

クラスインスタンスの値をフィルする場合

std::fill 関数や std::fill_n 関数を使ってクラスインスタンスを持つ配列を初期化する場合も、値を設定するときには代入演算子が使用されます。

そのため、代入する値に指定するデータの型は、クラスインスタンスが代入できる型を指定する必要があります。

 

クラスに何も配慮しない場合は、属性の値がシャローコピーされる代入演算子が実装されています。

クラスの代入演算子は、好きなデータ型を引数に取って実装できるので、たとえば整数型を受け取る代入演算子 "T& operator=(int value)" が定義されていれば、フィルする値も整数型の値を指定することができます。


[ もどる ]