質問: コード中の`m[S]++`の意味することがなんとなくはわかるのですが正確に説明できません。 入力が例えば ``` 4 taro jiro taro saburo ``` と来たときの挙動として 1. taro→まだないから0をvalueとして返す 2. jiro→まだないから1をvalueとして返す 3. taro→既出のため0をvalueとして返す 4. saburo→まだないから2をvalueとして返す だと理解していたのですが `m[S]++` というのは `m[S]=m[S]+1` のことであり右辺の `m[S]` に0入れて1入れて0入れて2入れて...とはならそうなのですが、ここがどういう仕組みなのか教えていただけますでしょうか?よろしくお願い致します。
回答: `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` に変化します。 その辺の挙動サンプル。実行する前にどんな表示が出るか推測してみませう。 ``` #include #include #include int main() { std::map 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; } ``` 競技プログラミング業界固有の `#include ` は普通の [c++](/questions/tagged/c%2b%2b "'c++' のタグが付いた質問を表示") では一般的ではないので、仕事で [c++](/questions/tagged/c%2b%2b "'c++' のタグが付いた質問を表示") を使う人には好まれません。また大域 `using namespace std;` も、ぴゅあ c++er には嫌われます。競技プログラミングという狭い世界の常識が世界の常識と思わないでください。