私はすでにこの質問をどこかで見たと確信しています(comp.lang.c ++?Googleもそこで見つけられないようです)が、ここで簡単に検索しても見つからないようなので、ここにあります:
キーが存在しない場合、std::map operator[] がオブジェクトを作成するのはなぜですか? わかりませんが、他のほとんどの operator[] (std::vector など) と比較すると、これは直感に反するように思えます。使用する場合は、インデックスが存在することを確認する必要があります。std::map でこの動作を実装する理由は何だろうと思っています。私が言ったように、ベクトルのインデックスのように振る舞い、無効なキーでアクセスしたときにクラッシュする方が直感的ではないでしょうか (未定義の動作だと思います)。
答えを見た後に質問を絞り込む:
わかりましたこれまでのところ、基本的に安いので、なぜそうしないのか、または同様のことを言う多くの回答を得ました. 私はそれに完全に同意しますが、そのために専用の関数を使用しないのはなぜですか(Javaにはoperator []がなく、関数はputと呼ばれるとコメントの1つが言ったと思います)?私のポイントは、なぜ map operator[] がベクトルのように機能しないのですか? ベクトルの範囲外のインデックスで operator[] を使用すると、たとえ安価であっても要素を挿入したくありません。これは、おそらくコードのエラーを意味するためです。私のポイントは、なぜそれがマップと同じではないのかということです。つまり、私にとって、マップで operator[] を使用することは、このキーが既に存在することを知っていることを意味します (何らかの理由で、挿入しただけで、どこかに冗長性があります)。その方が直感的にわかりやすいと思います。
そうは言っても、現在の動作を operator[] で実行する利点は何ですか? 多分それはそのようにより明確なコードを与えるでしょうか?知らない。
別の答えは、それはすでにそのように存在していたので、なぜそれを保持しないのですか? したがって、私の質問は基本的に次のとおりです。なぜそのように実装することを選択するのか、つまり、他の演算子[]との一貫性がやや欠けていることを意味します。どのようなメリットがありますか?
ありがとう