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 gleich key bzw. x ist, und führt eine Einfügung durch, falls ein solcher Schlüssel noch nicht existiert.
value_type-Objekt ein, das aus std::piecewise_construct, std::forward_as_tuple(key), std::tuple<>() erstellt wird, falls der Schlüssel nicht existiert.key kopierkonstruiert und der zugeordnete Wert wertinitialisiert. -value_type muss von std::piecewise_construct, std::forward_as_tuple(key), std::tuple<>() EmplaceConstructible sein. Wenn der Standard-Allocator verwendet wird, bedeutet dies, dass key_type CopyConstructible und mapped_type DefaultConstructible sein muss. |
value_type-Objekt ein, das aus std::piecewise_construct, std::forward_as_tuple(std::move(key)), std::tuple<>() erstellt wird, falls der Schlüssel nicht existiert.Wenn der Standard-Allocator verwendet wird, wird der Schlüssel aus
key move-konstruiert und der zugeordnete Wert wertinitialisiert. -value_type muss von std::piecewise_construct, std::forward_as_tuple(std::move(key)), std::tuple<>() EmplaceConstructible sein. Wenn der Standard-Allocator verwendet wird, bedeutet dies, dass key_type MoveConstructible und mapped_type DefaultConstructible sein muss. |
value_type-Objekt ein, falls kein Schlüssel existiert, der transparent mit dem Wert x verglichen werden kann.Hash mit Typen K und Key aufrufbar ist und dass KeyEqual transparent ist, was zusammen das Aufrufen dieser Funktion ermöglicht, ohne eine Instanz von Key zu konstruieren.Wenn nach der Operation die neue Anzahl der Elemente größer ist als max_load_factor() * bucket_count(), findet ein Rehashing statt.
Wenn Rehashing stattfindet (aufgrund der Einfügung), werden alle Iteratoren ungültig. Andernfalls (kein Rehashing) werden Iteratoren nicht ungültig.
Inhalt |
[bearbeiten] Parameter
| key | - | der Schlüssel des zu findenden Elements |
| x | - | ein Wert eines beliebigen Typs, der transparent mit einem Schlüssel verglichen werden kann |
[bearbeiten] Rückgabewert
[bearbeiten] Ausnahmen
Wenn eine Ausnahme durch eine Operation ausgelöst wird, hat die Einfügung keine Auswirkung.
[bearbeiten] Komplexität
Durchschnittlicher Fall: konstant, schlimmster Fall: linear zur Größe.
[bearbeiten] Anmerkungen
In den veröffentlichten Standards C++11 und C++14 war für diese Funktion vorgeschrieben, dass mapped_type DefaultInsertable und key_type CopyInsertable oder MoveInsertable in *this sein musste. Diese Spezifikation war fehlerhaft und wurde durch LWG Issue 2469 behoben, und die obige Beschreibung enthält die Lösung dieses Problems.
Eine Implementierung (libc++) ist jedoch dafür bekannt, die Objekte vom Typ key_type und mapped_type über zwei separate construct()-Aufrufe des Allocators zu erstellen, wie es nach den veröffentlichten Standards argumentativ erforderlich war, anstatt ein value_type-Objekt zu emplacen.
operator[] ist nicht-const, da er den Schlüssel einfügt, falls er nicht existiert. Wenn dieses Verhalten unerwünscht ist oder der Container const ist, kann at verwendet werden.
|
|
(seit C++17) |
| Feature-Test-Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_lib_associative_heterogeneous_insertion |
202311L |
(C++26) | Heterogene Überladungen für die verbleibenden Member-Funktionen in geordneten und ungeordneten assoziativen Containern. (3) |
[bearbeiten] 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; // updates an existing value letter_counts['x'] = 9; // inserts a new value println("after modifications it contains: ", letter_counts); // count the number of occurrences of each word // (the first call to operator[] initialized the counter with zero) 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"]; // just inserts the pair {"that", 0} 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'[bearbeiten] Siehe auch
| Greift mit Überprüfung auf ein bestimmtes Element zu (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) |
| (C++17) |
fügt "in place" ein, wenn der Schlüssel nicht existiert, tut nichts, wenn der Schlüssel existiert (public member function) |