次のように、map
またはunordered_map
経由 でアイテムを追加する例がたくさんあります。operator[]
int main() {
unordered_map <string, int> m;
m["foo"] = 42;
cout << m["foo"] << endl;
}
insert
代わりにメンバー関数を使用する理由はありますか? どちらも同じことをしているように見えます。
次のように、map
またはunordered_map
経由 でアイテムを追加する例がたくさんあります。operator[]
int main() {
unordered_map <string, int> m;
m["foo"] = 42;
cout << m["foo"] << endl;
}
insert
代わりにメンバー関数を使用する理由はありますか? どちらも同じことをしているように見えます。
2つは同等ではありません。 は既存の値を上書きせず、既に存在するかどうかに関係なく、 はキーの場所を返しinsert
ます。は、挿入が発生したかどうかを示します。pair<iterator, bool>
iterator
bool
operator[]
効果的にオンキーを実行lower_bound
します。その操作の結果がiterator
同じキーの場合、値への参照を返します。そうでない場合は、デフォルトで構築された値を持つ新しいノードを挿入し、値への参照を返します。これがoperator[]
非 const メンバーである理由です。キー値が存在しない場合は、キー値を自動有効化します。 値の型の構築にコストがかかる場合、これはパフォーマンスに影響を与える可能性があります。
また、C++11 には、挿入が発生した場合に、転送された引数からキーと値のペアをその場で構築することを除いて、 とemplace
ほぼ同じように機能するメソッドがあることに注意してください。insert