7

次のように、mapまたはunordered_map経由 でアイテムを追加する例がたくさんあります。operator[]

int main() {
    unordered_map <string, int> m;
    m["foo"] = 42;
    cout << m["foo"] << endl;
}

insert代わりにメンバー関数を使用する理由はありますか? どちらも同じことをしているように見えます。

4

4 に答える 4

2

2つは同等ではありません。 は既存の値を上書きせず、既に存在するかどうかに関係なく、 はキーの場所を返しinsertます。は、挿入が発生したかどうかを示します。pair<iterator, bool>iteratorbool

operator[]効果的にオンキーを実行lower_boundします。その操作の結果がiterator同じキーの場合、値への参照を返します。そうでない場合は、デフォルトで構築された値を持つ新しいノードを挿入し、値への参照を返します。これがoperator[]非 const メンバーである理由です。キー値が存在しない場合は、キー値を自動有効化します。 値の型の構築にコストがかかる場合、これはパフォーマンスに影響を与える可能性があります。

また、C++11 には、挿入が発生した場合に、転送された引数からキーと値のペアをその場で構築することを除いて、 とemplaceほぼ同じように機能するメソッドがあることに注意してください。insert

于 2013-04-03T15:40:41.493 に答える