65450


私は以前までPythonを用いてプログラミングをしておりましたが,  
競技プログラミングで初めてC++を使うようになりました.

AtcoderのABC157のdの問題で, UnionFindを用いることがあり解説を見ていてわからない点がございましたので質問いたします.

[code]

    struct UnionFind {
      vector<int> d;
      UnionFind(int n=0): d(n,-1) {}
      int find(int x) {
        if (d[x] < 0) return x;
        return d[x] = find(d[x]);
      }
      bool unite(int x, int y) {
        x = find(x); y = find(y);
        if (x == y) return false;
        if (d[x] > d[y]) swap(x,y);
        d[x] += d[y];
        d[y] = x;
        return true;
      }
      bool same(int x, int y) { return find(x) == find(y);}
      int size(int x) { return -d[find(x)];}
    };
    
[/code]

これでUnionFindを定義しているのですが,  
最初の部分の,

[code]

    UnionFind(int n=0): d(n,-1) {}
    
[/code]

の意味がわかりません.  
Pythonで言うところでは `__init__` のようなものなのでしょうか？

また, いままでC++では `:` の記号はあまり用いておりませんでしたので,  
その点を含めてご教授いただきたいです.  
ご回答のほどよろしくお願い致します.


CC BY-SA 4.0
2020-04-07T14:42:59.463
65447
2020-04-08T00:56:55.403
2020-04-08T00:56:55.403
3060
31609
question
c++
C++ のstructの宣言方法について


これは構造体の[コンストラクタ](https://ja.cppreference.com/w/cpp/language/initializer_list)の定義です。C++
の「コンストラクタ」とは、大雑把に言うと「初期化時に呼ばれる関数」という意味で Python の `__init__`
と似たものです。これがコンストラクタだと分かるのは、名前が構造体そのものと同じ（ように見える）からです。

一番素朴なコンストラクタ定義は、次のようなものです。

[code]

    UnionFind() {}
    
[/code]

このように定義すると何もしないコンストラクタが定義できます。

今回のコンストラクタでは、これに対してふたつの要素が追加されています：

[code]

    UnionFind(int n=0): d(n,-1) {}
    
[/code]

  1. ひとつは引数です。`(int n=0)` の部分です。`int` 型の引数 `n` を設け、更にこれが省略されたときの[デフォルト値](https://ja.cppreference.com/w/cpp/language/default_arguments)を `0` としています。
  2. もうひとつはデフォルトメンバ初期化子です。コロンの後に続く `d(n,-1)` の部分です。ここには構造体のメンバをどう初期化するかを書けます。今回 `d` は `vector<int>` なので、vector のコンストラクタを使って初期化されます。具体的には `d` は全ての要素が `-1` で初期化された長さ `d` の vector として初期化されます。

より詳しくは、C++ の入門書などを参考になさってみてください。


CC BY-SA 4.0
2020-04-07T19:44:56.230
65450
2020-04-08T00:18:35.700
2020-04-08T00:18:35.700
19110
19110
65447
answer