Page List

Search on the blog

2010年11月14日日曜日

知ってると便利なSTL(5) fill, fill_n

今日は、便利なSTLについて。
  • fill
  • fill_n
を紹介します。その名の通り、配列やコンテナをある値で”埋める”ことができる関数です。初期化のときに重宝します。

同じような標準関数にmemset()がありますが、こちらは1byte単位で値を初期化するため、charの初期化には有効ですが、intの初期化にはあまり都合がよくありません。(0で初期化するのであれば問題ありませんが、1や-1で初期化するのは面倒。詳しくは、memset()とmemcpy()を参照。)

これに対して、fill()、fill_n()は、その型に対応した単位で初期化を実行できるためとても便利です。

それでは、実際に動かしてみます。
まずは、fill()から。
void fill ( ForwardIterator first, ForwardIterator last, const T& value );
という形で使用し、[first, last)区間の要素をvalueにセットします。



int main() {
int x[10];
vector<string> names(7);

fill(x, x+10, 100);
fill(names.begin(), names.end(), "ken-ken");

REP(i, 10)
printf("%d\n", x[i]);

REP(i, 7)
printf("%s\n", names[i].c_str());

return 0;
}



次に、fill_n。
void fill_n ( OutputIterator first, Size n, const T& value );
という形で使用し、[first, first+n)までの要素をvalueにセットします。


int main() {
int x[10];
vector<int> y(10);
char z[10];

fill_n(x, SIZE(x), 10);
fill_n(y.begin(), 10, -1);
fill_n(z, 10, 'o');

REP(i, 10)
printf("%d\n", x[i]);

REP(i, 10)
printf("%d\n", y[i]);

REP(i, 10)
printf("%c\n", z[i]);

return 0;
}


要素数が可変なコンテナ(vectorなど)に対してはfill()を、要素数が固定長の配列の場合は、fill_n()を使うといいかと思います。

0 件のコメント:

コメントを投稿