Namensräume
Varianten
Aktionen

std::unordered_map<Key,T,Hash,KeyEqual,Allocator>::emplace

Von cppreference.com
 
 
 
 
template< class... Args >
std::pair<iterator, bool> emplace( Args&&... args );
(seit C++11)

Fügt ein neues Element in den Container ein, das mit den gegebenen args direkt konstruiert wird, falls kein Element mit diesem Schlüssel im Container vorhanden ist.

Der Konstruktor des neuen Elements (d. h. std::pair<const Key, T>) wird mit exakt denselben Argumenten aufgerufen, wie sie an emplace übergeben wurden, weitergeleitet mittels std::forward<Args>(args).... Das Element kann auch dann konstruiert werden, wenn bereits ein Element mit diesem Schlüssel im Container vorhanden ist, in welchem Fall das neu konstruierte Element sofort zerstört wird (siehe try_emplace(), falls dieses Verhalten unerwünscht ist).

Eine sorgfältige Verwendung von emplace ermöglicht die Konstruktion des neuen Elements unter Vermeidung unnötiger Kopier- oder Verschiebungsoperationen.

Wenn nach der Operation die neue Anzahl der Elemente größer ist als max_load_factor() * bucket_count(), findet ein Rehashing statt.
Wenn Rehashing stattfindet (aufgrund der Einfügung), werden alle Iteratoren ungültig. Andernfalls (kein Rehashing) werden Iteratoren nicht ungültig.

Inhalt

[bearbeiten] Parameter

args - Argumente, die an den Konstruktor des Elements weitergeleitet werden

[bearbeiten] Rückgabewert

Ein Paar, das aus einem Iterator zu dem eingefügten Element (oder zu dem Element, das die Einfügung verhindert hat) und einem bool-Wert besteht, der genau dann true ist, wenn die Einfügung stattgefunden hat.

[bearbeiten] Ausnahmen

Wenn aus irgendeinem Grund eine Ausnahme ausgelöst wird, hat diese Funktion keine Auswirkungen (starkes Ausnahmesicherheitsgarantie).

[bearbeiten] Komplexität

Im Durchschnitt amortisiert konstant, im schlimmsten Fall linear zur Größe des Containers.

[bearbeiten] Beispiel

#include <iostream>
#include <string>
#include <utility>
#include <unordered_map>
 
int main()
{
    std::unordered_map<std::string, std::string> m;
 
    // uses pair's move constructor
    m.emplace(std::make_pair(std::string("a"), std::string("a")));
 
    // uses pair's converting move constructor
    m.emplace(std::make_pair("b", "abcd"));
 
    // uses pair's template constructor
    m.emplace("d", "ddd");
 
    // emplace with duplicate key has no effect
    m.emplace("d", "DDD");
 
    // uses pair's piecewise constructor
    m.emplace(std::piecewise_construct,
              std::forward_as_tuple("c"),
              std::forward_as_tuple(10, 'c'));
    // an alternative is: m.try_emplace("c", 10, 'c');
 
    for (const auto& p : m)
        std::cout << p.first << " => " << p.second << '\n';
}

Mögliche Ausgabe

a => a
b => abcd
c => cccccccccc
d => ddd

[bearbeiten] Siehe auch

konstruiert Elemente "in place" unter Verwendung eines Hinweises
(public member function) [edit]
fügt "in place" ein, wenn der Schlüssel nicht existiert, tut nichts, wenn der Schlüssel existiert
(public member function) [edit]
fügt Elemente ein oder Knoten(seit C++17)
(public member function) [edit]