chacoderのブログ

競技プログラミングそのほか

配列の初期化とmemset

配列の初期化とmemset

配列の初期化について蟻本P174にmemsetという関数がでてきました。
手元のC++の入門書には載っていない関数でした。

これまで配列の初期化をするときにはforループを回して初期化値を挿入していましたが、この関数を使うと簡単にできそうです。

コード例

#include <bits/stdc++.h>
using namespace std;

int main(){
  int dp[10][10];
  memset(dp,-1,sizeof(dp));
  for(int i=0;i<10;i++){
    for(int j=0;j<10;j++){
      cout<<dp[i][j];
    }
    cout<<endl;
  }
  return 0;
}

出力

-1-1-1-1-1-1-1-1-1-1
-1-1-1-1-1-1-1-1-1-1
-1-1-1-1-1-1-1-1-1-1
-1-1-1-1-1-1-1-1-1-1
-1-1-1-1-1-1-1-1-1-1
-1-1-1-1-1-1-1-1-1-1
-1-1-1-1-1-1-1-1-1-1
-1-1-1-1-1-1-1-1-1-1
-1-1-1-1-1-1-1-1-1-1
-1-1-1-1-1-1-1-1-1-1

応用

先のコードのmemsetの最後の引数をint 1個分4(bite)にしてみました。
最初の1個だけが-1になりました。

なお最初にint dp[10][10]={};で0埋めしておかないとぐちゃぐちゃになりました。

int main(){
  int dp[10][10]={};
  memset(dp,-1,4);
  for(int i=0;i<10;i++){
    for(int j=0;j<10;j++){
      cout<<dp[i][j];
    }
    cout<<endl;
  }
  return 0;
}

出力例

-1000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000

memsetの引数

memsetの引数に関するwikipediaの説明です。

#include
void *memset(void *buf, int c, size_t n);

bufはunsigned char *型にキャストされる。cはunsigned char型にキャストされる。