Namespaces
Variants

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

From cppreference.net
std:: pair < iterator, bool > insert ( const value_type & value ) ;
(1) (seit C++11)
std:: pair < iterator, bool > insert ( value_type && value ) ;
(2) (seit C++17)
template < class P >
std:: pair < iterator, bool > insert ( P && value ) ;
(3) (seit C++11)
iterator insert ( const_iterator hint, const value_type & value ) ;
(4) (seit C++11)
iterator insert ( const_iterator hint, value_type && value ) ;
(5) (seit C++17)
template < class P >
iterator insert ( const_iterator hint, P && value ) ;
(6) (seit C++11)
template < class InputIt >
void insert ( InputIt first, InputIt last ) ;
(7) (seit C++11)
void insert ( std:: initializer_list < value_type > ilist ) ;
(8) (seit C++11)
insert_return_type insert ( node_type && nh ) ;
(9) (seit C++17)
iterator insert ( const_iterator hint, node_type && nh ) ;
(10) (seit C++17)

Fügt Element(e) in den Container ein, falls der Container noch kein Element mit einem äquivalenten Schlüssel enthält.

1-3) Fügt value ein.
Overload (3) ist äquivalent zu emplace ( std:: forward < P > ( value ) ) und nimmt nur an der Überladungsauflösung teil, wenn std:: is_constructible < value_type, P && > :: value == true .
4-6) Fügt value ein, wobei hint als nicht bindende Empfehlung für den Startpunkt der Suche verwendet wird.
Überladung (6) ist äquivalent zu emplace_hint ( hint, std:: forward < P > ( value ) ) und nimmt nur an der Überladungsauflösung teil, wenn std:: is_constructible < value_type, P && > :: value == true .
7) Fügt Elemente aus dem Bereich [ first , last ) ein. Wenn mehrere Elemente im Bereich Schlüssel haben, die äquivalent verglichen werden, ist nicht spezifiziert, welches Element eingefügt wird (ausstehend LWG2844 ).
Falls [ first , last ) kein gültiger Bereich ist, oder first und/oder last Iteratoren in * this sind, ist das Verhalten undefiniert.
8) Fügt Elemente aus der Initialisierungsliste ilist ein. Wenn mehrere Elemente im Bereich Schlüssel haben, die äquivalent verglichen werden, ist nicht spezifiziert, welches Element eingefügt wird (ausstehend LWG2844 ).
9) Wenn nh ein leerer node handle ist, tut nichts. Andernfalls fügt das Element, das von nh besessen wird, in den Container ein, falls der Container noch kein Element mit einem Schlüssel enthält, der äquivalent zu nh. key ( ) ist. Das Verhalten ist undefiniert, wenn nh nicht leer ist und get_allocator ( ) ! = nh. get_allocator ( ) .
10) Wenn nh ein leerer node handle ist, tut nichts und gibt den End-Iterator zurück. Andernfalls fügt das Element, das von nh gehalten wird, in den Container ein, falls der Container noch kein Element mit einem Schlüssel äquivalent zu nh. key ( ) enthält, und gibt den Iterator zurück, der auf das Element mit Schlüssel äquivalent zu nh. key ( ) zeigt (unabhängig davon, ob das Einfügen erfolgreich war oder fehlgeschlagen ist). Wenn das Einfügen erfolgreich ist, wird nh verschoben, andernfalls behält es das Eigentum am Element. hint wird als nicht bindende Empfehlung verwendet, wo die Suche beginnen sollte. Das Verhalten ist undefiniert, wenn nh nicht leer ist und get_allocator ( ) ! = nh. get_allocator ( ) .

Falls nach dem Vorgang die neue Anzahl der Elemente größer ist als alt max_load_factor() * bucket_count() findet eine Neuverteilung statt.
Falls eine Neuverteilung auftritt (durch das Einfügen), werden alle Iteratoren ungültig. Andernfalls (keine Neuverteilung) werden Iteratoren nicht ungültig. Wenn das Einfügen erfolgreich ist, werden Zeiger und Referenzen auf das Element, die während es im Node Handle gehalten wurde, ungültig, und Zeiger und Referenzen, die vor dem Extrahieren auf dieses Element erhalten wurden, werden gültig. (seit C++17)

Inhaltsverzeichnis

Parameter

hint - Iterator, der als Vorschlag dient, wo der Inhalt eingefügt werden soll
value - Einzufügender Elementwert
first, last - Das Iteratorpaar, das den Quell- Bereich der einzufügenden Elemente definiert
ilist - Initialisierungsliste, aus der die Werte eingefügt werden
nh - Ein kompatibles Node Handle
Typanforderungen
-
InputIt muss die Anforderungen von LegacyInputIterator erfüllen.

Rückgabewert

1-3) Ein Paar bestehend aus einem Iterator zum eingefügten Element (oder zum Element, das die Einfügung verhindert hat) und einem bool -Wert, der auf true gesetzt ist, genau dann wenn die Einfügung stattgefunden hat.
4-6) Ein Iterator zum eingefügten Element oder zum Element, das die Einfügung verhindert hat.
7,8) (keine)
9) Ein Objekt vom Typ insert_return_type mit den wie folgt initialisierten Mitgliedern:
  • Wenn nh leer ist, inserted ist false , position ist end ( ) , und node ist leer.
  • Andernfalls, wenn die Einfügung stattgefunden hat, inserted ist true , position zeigt auf das eingefügte Element, und node ist leer.
  • Wenn die Einfügung fehlgeschlagen ist, inserted ist false , node hat den vorherigen Wert von nh , und position zeigt auf ein Element mit einem Schlüssel, der äquivalent zu nh. key ( ) ist.
10) End-Iterator, wenn nh leer war, Iterator, der auf das eingefügte Element zeigt, wenn die Einfügung stattgefunden hat, und Iterator, der auf ein Element mit einem Schlüssel zeigt, der äquivalent zu nh. key ( ) ist, wenn es fehlgeschlagen ist.

Ausnahmen

1-6) Wenn aus irgendeinem Grund eine Exception ausgelöst wird, haben diese Funktionen keine Wirkung ( strong exception safety guarantee ).
7,8) Keine Ausnahmesicherheitsgarantie.
9,10) Wenn aus irgendeinem Grund eine Exception ausgelöst wird, haben diese Funktionen keine Wirkung ( strong exception safety guarantee ).

Komplexität

1-6) Durchschnittlicher Fall: O(1) , schlechtester Fall O(size()) .
7,8) Durchschnittlicher Fall: O(N) , wobei N die Anzahl der einzufügenden Elemente ist. Schlechtester Fall: O(N * size() + N) .
9,10) Durchschnittlicher Fall: O(1) , schlechtester Fall O(size()) .

Hinweise

Das angedeutete Einfügen ( ( 4-6 ) und ( 10 ) ) gibt kein Boolean zurück, um signaturkompatibel mit positionellem Einfügen bei sequentiellen Containern wie std::vector::insert zu sein. Dies ermöglicht die Erstellung generischer Einfüger wie std::inserter . Eine Möglichkeit, den Erfolg eines angedeuteten Einfügens zu überprüfen, ist der Vergleich von size() vor und nach dem Vorgang.

Beispiel

#include <iostream>
#include <string>
#include <unordered_map>
int main ()
{
    std::unordered_map<int, std::string> dict = {{1, "one"}, {2, "two"}};
    dict.insert({3, "three"});
    dict.insert(std::make_pair(4, "four"));
    dict.insert({{4, "another four"}, {5, "five"}});
    const bool ok = dict.insert({1, "another one"}).second;
    std::cout << "inserting 1 => \"another one\" "
              << (ok ? "succeeded" : "failed") << '\n';
    std::cout << "contents:\n";
    for (auto& p : dict)
        std::cout << ' ' << p.first << " => " << p.second << '\n';
}

Mögliche Ausgabe:

inserting 1 => "another one" failed
contents:
 5 => five
 1 => one
 2 => two
 3 => three
 4 => four

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
LWG 2005 C++11 Überladungen ( 3 ) und ( 6 ) würden nur an der Überladungsauflösung
teilnehmen, wenn P implizit in value_type konvertierbar ist
nimmt nur teil, wenn value_type
konstruierbar ist aus P &&

Siehe auch

Konstruiert Element direkt vor Ort
(öffentliche Elementfunktion)
Konstruiert Elemente direkt vor Ort mit Hinweis
(öffentliche Elementfunktion)
Fügt ein Element ein oder weist es zu, wenn der Schlüssel bereits existiert
(öffentliche Elementfunktion)
Erstellt einen std::insert_iterator vom vom Argument abgeleiteten Typ
(Funktionstemplate)