mapのoperator[]
cppreference.com の map::operator[] の説明を読むと、こんなことが書かれています。
1) Essentially performs (insert(std::make_pair(key, T())).first)->second.
std::map::operator[] - cppreference.com
2) Essentially performs (insert(std::make_pair(std::move(key), T())).first)->second.
operator[] は insert(make_pair(key, T())).first->second と同じだ的なことを言ってるのですが、これ、違いますよね?
この場合だと既に key の要素が存在しているとき、T() のコンストラクタは無駄になるので、こっちの方が効率が悪くなるし、コンストラクタに副作用なんかがある場合は明らかに異なります。
他のところではどう説明しているのか調べてみると…。
m[k] is equivalent to (**1.second.
http://www.sgi.com/tech/stl/Map.html#3
A call to this function is equivalent to:
map::operator[] - C++ Reference
(**2.second
どれも同じ。
map_type m; m[key] += value;
と等価な処理をするなら、
map_type::iterator it = m.lower_bound(key); if (it == m.end() || m.key_comp()(key, it->first)) m.insert(it, std::make_pair(key, map_type::mapped_type()))->second += value; else it->second += value;
と書かないといけない気がします。