std::unordered_map<Key,T,Hash,KeyEqual,Allocator>:: operator[]
|
T
&
operator
[
]
(
const
Key
&
key
)
;
|
(1) | (seit C++11) |
|
T
&
operator
[
]
(
Key
&&
key
)
;
|
(2) | (seit C++11) |
|
template
<
class
K
>
T & operator [ ] ( K && x ) ; |
(3) | (seit C++26) |
Gibt eine Referenz auf den Wert zurück, der einem Schlüssel entspricht, der key oder x äquivalent ist, wobei eine Einfügung durchgeführt wird, falls ein solcher Schlüssel noch nicht existiert.
value_type
Objekt ein, das direkt vor Ort konstruiert wird aus
std::
piecewise_construct
,
std::
forward_as_tuple
(
key
)
,
std::
tuple
<>
(
)
falls der Schlüssel nicht existiert.
key
kopierkonstruiert wird und der zugeordnete Wert
wertinitialisiert
wird.
-
value_type
muss
EmplaceConstructible
aus
std::
piecewise_construct
,
std::
forward_as_tuple
(
key
)
,
std::
tuple
<>
(
)
sein. Bei Verwendung des Standard-Allokators bedeutet dies, dass
key_type
CopyConstructible
und
mapped_type
DefaultConstructible
sein muss.
|
value_type
Objekt ein, das direkt konstruiert wird aus
std::
piecewise_construct
,
std::
forward_as_tuple
(
std
::
move
(
key
)
)
,
std::
tuple
<>
(
)
falls der Schlüssel nicht existiert.
Bei Verwendung des Standard-Allokators führt dies dazu, dass der Schlüssel aus
key
move-konstruiert wird und der zugeordnete Wert
wertinitialisiert
wird.
-
value_type
muss
EmplaceConstructible
aus
std::
piecewise_construct
,
std::
forward_as_tuple
(
std
::
move
(
key
)
)
,
std::
tuple
<>
(
)
sein. Bei Verwendung des Standard-Allokators bedeutet dies, dass
key_type
MoveConstructible
und
mapped_type
DefaultConstructible
sein muss.
|
value_type
-Objekt ein, das direkt vor Ort konstruiert wird, falls kein Schlüssel vorhanden ist, der transparent
äquivalent
zum Wert
x
verglichen wird.
Hash
und
KeyEqual
beide
transparent
sind. Dies setzt voraus, dass ein solcher
Hash
sowohl mit dem Typ
K
als auch mit dem Typ
Key
aufrufbar ist und dass
KeyEqual
transparent ist, was zusammen den Aufruf dieser Funktion ermöglicht, ohne eine Instanz von
Key
zu konstruieren.
Falls nach der Operation die neue Anzahl der Elemente größer ist als das alte
max_load_factor()
*
bucket_count()
findet eine Neuverteilung statt.
Falls eine Neuverteilung auftritt (aufgrund der Einfügung), werden alle Iteratoren ungültig. Andernfalls (keine Neuverteilung) bleiben Iteratoren gültig.
Inhaltsverzeichnis |
Parameter
| key | - | der Schlüssel des zu findenden Elements |
| x | - | ein Wert beliebigen Typs, der transparent mit einem Schlüssel verglichen werden kann |
Rückgabewert
Ausnahmen
Wenn eine Ausnahme von einer beliebigen Operation ausgelöst wird, hat die Einfügung keine Auswirkung.
Komplexität
Durchschnittlicher Fall: konstant, schlechtester Fall: linear in der Größe.
Hinweise
In den veröffentlichten C++11- und C++14-Standards war diese Funktion spezifiziert, dass sie erfordert, dass
mapped_type
DefaultInsertable
ist und
key_type
CopyInsertable
oder
MoveInsertable
in
*
this
sein muss. Diese Spezifikation war fehlerhaft und wurde durch
LWG Issue 2469
korrigiert, und die obige Beschreibung beinhaltet die Lösung dieses Issues.
Allerdings ist eine Implementierung (libc++) dafür bekannt, die
key_type
und
mapped_type
Objekte über zwei separate Allokator-
construct()
Aufrufe zu konstruieren, wie nach den veröffentlichten Standards wohl erforderlich, anstatt ein
value_type
Objekt zu emplaceieren.
operator
[
]
ist nicht konstant, da er den Schlüssel einfügt, falls er nicht existiert. Falls dieses Verhalten unerwünscht ist oder der Container
const
ist, kann
at
verwendet werden.
|
|
(since C++17) |
| Feature-Test Makro | Wert | Std | Funktion |
|---|---|---|---|
__cpp_lib_associative_heterogeneous_insertion
|
202311L
|
(C++26) | Heterogene Überladungen für die verbleibenden Memberfunktionen in geordneten und ungeordneten assoziativen Containern . ( 3 ) |
Beispiel
#include <iostream> #include <string> #include <unordered_map> void println(auto const comment, auto const& map) { std::cout << comment << '{'; for (const auto& pair : map) std::cout << '{' << pair.first << ": " << pair.second << '}'; std::cout << "}\n"; } int main() { std::unordered_map<char, int> letter_counts{{'a', 27}, {'b', 3}, {'c', 1}}; println("letter_counts initially contains: ", letter_counts); letter_counts['b'] = 42; // aktualisiert einen vorhandenen Wert letter_counts['x'] = 9; // fügt einen neuen Wert ein println("after modifications it contains: ", letter_counts); // zählt die Anzahl der Vorkommen jedes Wortes // (der erste Aufruf von operator[] initialisiert den Zähler mit null) std::unordered_map<std::string, int> word_map; for (const auto& w : {"this", "sentence", "is", "not", "a", "sentence", "this", "sentence", "is", "a", "hoax"}) ++word_map[w]; word_map["that"]; // fügt nur das Paar {"that", 0} ein for (const auto& [word, count] : word_map) std::cout << count << " occurrence(s) of word '" << word << "'\n"; }
Mögliche Ausgabe:
letter_counts initially contains: {{a: 27}{b: 3}{c: 1}}
after modifications it contains: {{a: 27}{b: 42}{c: 1}{x: 9}}
2 occurrence(s) of word 'a'
1 occurrence(s) of word 'hoax'
2 occurrence(s) of word 'is'
1 occurrence(s) of word 'not'
3 occurrence(s) of word 'sentence'
0 occurrence(s) of word 'that'
2 occurrence(s) of word 'this'
Siehe auch
|
Zugriff auf spezifisches Element mit Bereichsprüfung
(öffentliche Elementfunktion) |
|
|
(C++17)
|
Fügt ein Element ein oder weist dem aktuellen Element zu, falls der Schlüssel bereits existiert
(öffentliche Elementfunktion) |
|
(C++17)
|
Fügt direkt ein, falls der Schlüssel nicht existiert, tut nichts, falls der Schlüssel existiert
(öffentliche Elementfunktion) |