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にセットします。


  1. int main() {  
  2.     int x[10];  
  3.     vector<string> names(7);  
  4.   
  5.     fill(x, x+10, 100);  
  6.     fill(names.begin(), names.end(), "ken-ken");  
  7.   
  8.     REP(i, 10)  
  9.         printf("%d\n", x[i]);  
  10.   
  11.     REP(i, 7)  
  12.         printf("%s\n", names[i].c_str());  
  13.   
  14.     return 0;  
  15. }  



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

  1. int main() {  
  2.     int x[10];  
  3.     vector<int> y(10);  
  4.     char z[10];  
  5.   
  6.     fill_n(x, SIZE(x), 10);  
  7.     fill_n(y.begin(), 10, -1);  
  8.     fill_n(z, 10, 'o');  
  9.   
  10.     REP(i, 10)  
  11.         printf("%d\n", x[i]);  
  12.   
  13.     REP(i, 10)  
  14.         printf("%d\n", y[i]);  
  15.   
  16.     REP(i, 10)  
  17.         printf("%c\n", z[i]);  
  18.   
  19.     return 0;  
  20. }  


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

0 件のコメント:

コメントを投稿