

[AtCoder Beginner Contest
008](http://atcoder.jp/contests/abc008/tasks_print?lang=ja)

> ### 問題文
>
> とある組織で、リーダーを選ぶ選挙が行われた。組織はN人の構成員で構成されており、各人は最もリーダーにふさわしい人物の名前を書いた。  
>
> リーダーは、得票数が最も多い人物が選ばれることになっている。得票数が最も多い人物の名前を出力せよ。得票数が最も多い人物が複数いる場合は、そのうちどの名前を出力してもよい。
>
> ### 入力
>
> 入力は以下の形式で標準入力から与えられる。
[code]

>     N
>     S1
>     S2
>     :
>     SN
>  
[/code]

>
>   * 1行目には、組織の構成員の人数を表す整数N(1≦N≦50)が与えられる。
>   * 2行目から N行では、それぞれの構成員の投票内容を表す。N行のうち i(1≦i≦N)行目には文字列
> Siが書かれている。Siはi番目の人の投票内容を表している。  
>  Siは小文字の半角英字のみで構成されており、長さは1文字以上50文字以下である。
>

>
> ### 出力
>
> 得票数が最も多い人物の名前を出力せよ。得票数が最も多い人物が複数いる場合は、そのうちどの名前を出力してもよい。出力の末尾にも改行を入れること。

上記の問題の `std::map` を利用した下記の解答コードについて質問がございます。

[code]

    #include <bits/stdc++.h>
    using namespace std;
    
    int main(){
        int N, max = 0;
        string S, ans;
        map<string, int> m;
        cin >> N;
        for (int i = 0; i < N; i++) 
        {
            cin >> S;
            m[S]++;
            if (max < m[S]) {
                max = m[S];
                ans = S;
            }
        }
        cout << ans << endl;
        return 0;
    }
    
[/code]

# 質問内容

コード中の`m[S]++`の意味することがなんとなくはわかるのですが正確に説明できません。  
入力が例えば

[code]

    4
    taro
    jiro
    taro
    saburo
    
[/code]

と来たときの挙動として

  1. taro→まだないから0をvalueとして返す
  2. jiro→まだないから１をvalueとして返す
  3. taro→既出のため0をvalueとして返す
  4. saburo→まだないから2をvalueとして返す

だと理解していたのですが `m[S]++` というのは `m[S]=m[S]+1` のことであり右辺の `m[S]`
に0入れて1入れて0入れて2入れて...とはならそうなのですが、ここがどういう仕組みなのか教えていただけますでしょうか？よろしくお願い致します。


CC BY-SA 4.0
2020-06-01T01:30:40.067
67177
2020-06-01T11:13:55.417
2020-06-01T11:13:55.417
3060
35214
question
c++
c++のstd::mapについて


`std::map` の `m[s]` の挙動は

  * `m` 中に `s` 要素が既にあれば、格納済みの値を左辺値として返します
  * `m` 中に `s` 要素がない場合 `m` に `s` 要素をデフォルトコンストラクトして左辺値として返します

一番目に `m["taro"]` を評価したとき、まだ `m` 中に `"taro"` 要素が無いので、後者のごとく `m["taro"]`
自体と、その中の値 `int` が作られます。 `int` のデフォルトコンストラクト値は `0` です。このソースコードでは `m["taro"]++;`
となっているので、値は `1` に変化します。

二番目に `m["jiro"]` を評価したときも同様、この要素はないので新しく作られ初期値は `0` で、やはり同様に `++` によって `1`
に変化します。

三番目に `m["taro"]` を評価したとき、既にある `m["taro"]` の値が返されます。値は `1` が入っているので `2` に変化します。

その辺の挙動サンプル。実行する前にどんな表示が出るか推測してみませう。

[code]

    #include <map>
    #include <iostream>
    #include <string>
    
    int main() {
        std::map<std::string, int> m;
        std::cout << m.size() << std::endl;
        m["taro"];
        std::cout << m.size() << std::endl;
        std::cout << m["taro"] << std::endl;
        ++m["jiro"];
        std::cout << m["jiro"] << std::endl;
    }
    
[/code]

競技プログラミング業界固有の `#include <bits/stdc++.h>` は普通の [c++](/questions/tagged/c%2b%2b
"'c++' のタグが付いた質問を表示") では一般的ではないので、仕事で [c++](/questions/tagged/c%2b%2b "'c++'
のタグが付いた質問を表示") を使う人には好まれません。また大域 `using namespace std;` も、ぴゅあ c++er
には嫌われます。競技プログラミングという狭い世界の常識が世界の常識と思わないでください。


CC BY-SA 4.0
2020-06-01T02:13:58.850
67180
2020-06-01T02:54:29.540
2020-06-01T02:54:29.540
8589
8589
67177
answer