Was ist der Unterschied zwischen unordered_map :: emplace und unordered_map :: insert in C++?
Was ist der Unterschied zwischen unordered_map :: emplace und unordered_map :: insert in C++ ?
InformationsquelleAutor der Frage Harsh M. Shah | 2014-10-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
unordered_map::insert
kopiert oder verschiebt ein Schlüssel-Wert-paar in den container ein. Es ist überladen zu akzeptieren Referenz auf const oder eine rvalue-Referenz:unordered_map::emplace
können Sie, zur Vermeidung unnötiger kopiert oder verschiebt, indem er das element im Ort. Es nutzt perfect forwarding und ein variadic template Argumente an den Konstruktor der Schlüssel-Wert-paar:Aber es gibt eine große überlappung zwischen den beiden Funktionen.
emplace
können verwendet werden, um vorwärts zu der copy/move-Konstruktor der Schlüssel-Wert-paar und erlaubt es, um verwendet werden, wieinsert
würde. Dies bedeutet, dass die Verwendung vonemplace
nicht garantieren, dass Sie vermeiden, kopiert oder verschiebt. Auch die version voninsert
nimmt eine rvalue-Referenz ist tatsächlich Vorlagen und akzeptiert jede ArtP
so, dass der Schlüssel-Wert-paar ist bebaubar vonP
.Scott Meyers sagt:
( Edit: Howard Hinnant lief einige Experimentedie zeigte, dass manchmal
insert
ist schneller alsemplace
)Wenn Sie definitiv möchten, kopieren/verschieben in den container ist es ratsam, zu verwenden
insert
denn Sie sind mehr wahrscheinlich, um einen Kompilierungsfehler, wenn Sie falsche Argumente. Sie müssen vorsichtiger sein, Sie sind vorbei die richtigen Argumente, um die Einlagerung von Funktionen.Meisten Implementierungen von
unordered_map::emplace
verursachen wird Speicher dynamisch allokiert sein für das neue paar, auch wenn die Karte enthält ein Element mit diesem Schlüssel bereits und dieemplace
fehl. Dies bedeutet, dass, wenn es eine gute chance, dass einemplace
fehl, erhalten Sie möglicherweise eine bessere Leistung, die Verwendung von insert zu vermeiden, unnötige dynamische Zuweisung von Arbeitsspeicher.Kleines Beispiel:
Edit2: Auf Anfrage. Es ist auch möglich, mit
unordered_map::emplace
mit einem Schlüssel oder Wert, der mehr als eine Konstruktor-parameter. Mit derstd::pair
stückweise Konstruktor Sie können immer noch unnötige kopiert oder verschiebt.InformationsquelleAutor der Antwort Chris Drew