std::unordered_map<Key,T,Hash,KeyEqual,Allocator>::insert
| 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.
[first, last) ein. Wenn mehrere Elemente im Bereich Schlüssel haben, die als äquivalent verglichen werden, ist nicht spezifiziert, welches Element eingefügt wird (vorbehaltlich LWG2844).[first, last) kein gültiger Bereich ist oder first und/oder last Iteratoren in *this sind, ist das Verhalten undefiniert.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
insert_return_type mit den folgenden initialisierten Membern- Wenn nh leer ist, ist
insertedfalse,positionist end(), undnodeist leer. - Andernfalls, wenn die Einfügung stattgefunden hat, ist
insertedtrue,positionzeigt auf das eingefügte Element, undnodeist leer. - Wenn die Einfügung fehlgeschlagen ist, ist
insertedfalse,nodehat den vorherigen Wert von nh, undpositionzeigt auf ein Element mit einem Schlüssel, der äquivalent zu nh.key() ist.
[edit] Ausnahmen
[edit] Komplexität
O(1), schlimmster Fall O(size()).O(N), wobei N die Anzahl der einzufügenden Elemente ist. Schlimmster Fall: O(N * size() + N).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_typeaus P&& konstruierbar ist |
[edit] Siehe auch
| konstruiert Elemente direkt (in-place) (public member function) | |
| konstruiert Elemente "in place" unter Verwendung eines Hinweises (public member function) | |
| (C++17) |
fügt ein Element ein oder weist einem vorhandenen Element einen Wert zu, falls der Schlüssel bereits existiert (public member function) |
| erstellt einen std::insert_iterator vom Typ, der aus dem Argument abgeleitet wird (Funktionsvorlage) |