2次元配列の0初期化

競プロ中に気づいたことをメモ

まだまだ弱い人間なので0初期化もロクに理解していない

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

#define FOR(i,r,n) for(ll i = (ll)(r); i < (ll)(n); ++i)
#define REP(i,n) FOR(i,0,n)

using ll = long long int;

template < typename T >
inline void dbg(T a) {cout << a << ' ' << endl;}

ll a, b, n, ans = 0, sum = 0, cnt = 0;

int main() {
    cin >> n;
    ll tree[n][n] = { { 0 } };
    REP(i,n-1) {
        cin >> a >> b;
        tree[a-1][b-1] = 1;
    }
    for (auto && e : tree) {
        REP(i,n) { dbg(e[i]); }
    }
}

入力を以下のようにとるとき

4
1 1
2 2
3 3

AtCoderC++14(GCC 5.4.1)では以下のようになる

1 
4197637 
140722148830304 
6300464 
0 
1 
0 
0 
0 
0 
1 
0 
0 
0 
0 
0 

tree[0]の配列は{0}で初期化されない

配列をすべて0初期化したいならば

...

    ll tree[n][n] = {};

...

このように書けばよい

C++ならstd::fill(&(tree[0][0]),&(tree[n-1][n-1]),0);という方法もあるがこれは長いしめんどい