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 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.
[
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
).
[
first
,
last
)
kein
gültiger Bereich
ist, oder
first
und/oder
last
Iteratoren in
*
this
sind, ist das Verhalten undefiniert.
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
insert_return_type
mit den wie folgt initialisierten Mitgliedern:
-
Wenn
nh
leer ist,
insertedist false ,positionist end ( ) , undnodeist leer. -
Andernfalls, wenn die Einfügung stattgefunden hat,
insertedist true ,positionzeigt auf das eingefügte Element, undnodeist leer. -
Wenn die Einfügung fehlgeschlagen ist,
insertedist false ,nodehat den vorherigen Wert von nh , undpositionzeigt auf ein Element mit einem Schlüssel, der äquivalent zu nh. key ( ) ist.
Ausnahmen
Komplexität
O(1)
, schlechtester Fall
O(size())
.
O(N)
, wobei N die Anzahl der einzufügenden Elemente ist. Schlechtester Fall:
O(N * size() + N)
.
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) |
|
|
(C++17)
|
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) |