Namensräume
Varianten
Aktionen

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

Von cppreference.com
 
 
 
 
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 einfügen( 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.
Überladung (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 unverbindlicher Vorschlag verwendet wird, wo die Suche beginnen soll.
Ü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 [firstlast) ein. Wenn mehrere Elemente im Bereich Schlüssel haben, die als äquivalent verglichen werden, ist nicht spezifiziert, welches Element eingefügt wird (vorbehaltlich LWG2844).
Wenn [firstlast) 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 als äquivalent verglichen werden, ist nicht spezifiziert, welches Element eingefügt wird (vorbehaltlich LWG2844).
9) Wenn nh ein leerer Knotenhandle ist, tut dies nichts. Andernfalls wird das von nh besessene Element in den Container eingefügt, wenn 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 Knotenhandle ist, tut dies nichts und gibt den End-Iterator zurück. Andernfalls wird das von nh besessene Element in den Container eingefügt, wenn der Container noch kein Element mit einem Schlüssel enthält, der äquivalent zu nh.key() ist, und gibt den Iterator zurück, der auf das Element mit dem Schlüssel nh.key() zeigt (unabhängig davon, ob die Einfügung erfolgreich war oder fehlgeschlagen ist). Wenn die Einfügung erfolgreich ist, wird nh verschoben, andernfalls behält es den Besitz des Elements. hint wird als unverbindlicher Vorschlag verwendet, wo die Suche beginnen soll. Das Verhalten ist undefiniert, wenn nh nicht leer ist und get_allocator() != nh.get_allocator().

Wenn nach der Operation die neue Anzahl der Elemente größer ist als max_load_factor() * bucket_count(), findet ein Rehashing statt.
Wenn ein Rehashing stattfindet (aufgrund der Einfügung), werden alle Iteratoren ungültig. Andernfalls (kein Rehashing) werden Iteratoren nicht ungültig. Wenn die Einfügung erfolgreich ist, sind Zeiger und Referenzen auf das Element, die erhalten wurden, während es im Node-Handle gehalten wurde, ungültig, und Zeiger und Referenzen, die auf dieses Element erhalten wurden, bevor es extrahiert wurde, werden gültig.(seit C++17)

Inhalt

[edit] Parameter

hint - iterator, der als Vorschlag dient, wo der Inhalt eingefügt werden soll
value - Elementwert, der eingefügt werden soll
first, last - das Iteratorenpaar, das den Quell- Bereich der einzufügenden Elemente definiert
ilist - Initialisierungsliste, aus der die Werte eingefügt werden sollen
nh - ein kompatibler Node Handle
Typanforderungen
-
InputIt muss die Anforderungen von LegacyInputIterator erfüllen.

[edit] Rückgabewert

1-3) Ein Paar, bestehend aus einem Iterator auf das eingefügte Element (oder auf das 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 auf das eingefügte Element oder auf das Element, das die Einfügung verhindert hat.
7,8) (keiner)
9) Ein Objekt vom Typ insert_return_type mit den folgenden initialisierten Membern
  • Wenn nh leer ist, ist inserted false, position ist end(), und node ist leer.
  • Andernfalls, wenn die Einfügung stattgefunden hat, ist inserted true, position zeigt auf das eingefügte Element, und node ist leer.
  • Wenn die Einfügung fehlgeschlagen ist, ist inserted 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 diese fehlgeschlagen ist.

[edit] Ausnahmen

1-6) Wenn aus irgendeinem Grund eine Ausnahme ausgelöst wird, haben diese Funktionen keine Auswirkung (starke Ausnahmesicherheitgarantie).
7,8) Keine Garantie für Ausnahmensicherheit.
9,10) Wenn aus irgendeinem Grund eine Ausnahme ausgelöst wird, haben diese Funktionen keine Auswirkung (starke Ausnahmesicherheitgarantie).

[edit] Komplexität

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

[edit] Anmerkungen

Die mit einem Hinweis versehene Einfügung (4-6) gibt kein boolesches Ergebnis zurück, um mit der Positionsabhängigen Einfügung in sequenziellen Containern, wie z. B. std::vector::insert, kompatibel zu sein. Dies ermöglicht die Erstellung generischer Einfügungen wie z. B. std::inserter. Eine Möglichkeit, den Erfolg einer Einfügung mit Hinweis zu überprüfen, ist der Vergleich von size() vor und nach der Operation.

[edit] 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

[edit] Fehlerberichte

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

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

[edit] Siehe auch

konstruiert Elemente direkt (in-place)
(public member function) [edit]
konstruiert Elemente "in place" unter Verwendung eines Hinweises
(public member function) [edit]
fügt ein Element ein oder weist einem vorhandenen Element einen Wert zu, falls der Schlüssel bereits existiert
(public member function) [edit]
erstellt einen std::insert_iterator vom Typ, der aus dem Argument abgeleitet wird
(Funktionsvorlage) [bearbeiten]