次のように、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>iteratorbool
operator[]効果的にオンキーを実行lower_boundします。その操作の結果がiterator同じキーの場合、値への参照を返します。そうでない場合は、デフォルトで構築された値を持つ新しいノードを挿入し、値への参照を返します。これがoperator[]非 const メンバーである理由です。キー値が存在しない場合は、キー値を自動有効化します。 値の型の構築にコストがかかる場合、これはパフォーマンスに影響を与える可能性があります。
また、C++11 には、挿入が発生した場合に、転送された引数からキーと値のペアをその場で構築することを除いて、 とemplaceほぼ同じように機能するメソッドがあることに注意してください。insert