std::map<Key,T,Compare,Allocator>::operator[]
| T& operator[]( const Key& key ); |
(1) | |
| 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.
|
1) Fügt ein value_type(key, T()) ein, falls der Schlüssel nicht existiert.
|
(bis C++11) | ||||||
|
1) Fügt ein
value_type-Objekt ein, das aus std::piecewise_construct, std::forward_as_tuple(key), std::tuple<>() in-place konstruiert wird, falls der Schlüssel nicht existiert. Entspricht return this->try_emplace(key).first->second;.(seit C++17)Bei Verwendung des Standardallokators wird der Schlüssel aus
key kopierkonstruiert und der zugeordnete Wert wertinitialisiert.
2) Fügt ein
value_type-Objekt ein, das aus std::piecewise_construct, std::forward_as_tuple(std::move(key)), std::tuple<>() in-place konstruiert wird, falls der Schlüssel nicht existiert. Entspricht return this->try_emplace(std::move(key)).first->second;.(seit C++17) Bei Verwendung des Standardallokators wird der Schlüssel aus key move-konstruiert und der zugeordnete Wert wertinitialisiert.
|
(seit C++11) | ||||||
value_type-Objekt in-place ein, falls es keinen Schlüssel gibt, der transparent äquivalent zu dem Wert x ist.Key zu konstruieren.Keine Iteratoren oder Referenzen werden 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
Logarithmisch zur Größe des Containers.
[bearbeiten] Anmerkungen
In den veröffentlichten Standards C++11 und C++14 wurde diese Funktion so spezifiziert, dass sie mapped_type als DefaultInsertable und key_type als CopyInsertable oder MoveInsertable in *this erfordert. Diese Spezifikation war fehlerhaft und wurde durch LWG Issue 2469 behoben. Die obige Beschreibung beinhaltet die Lösung dieses Problems.
Eine Implementierung (libc++) ist jedoch dafür bekannt, die Objekte key_type und mapped_type über zwei separate Allocator-construct()-Aufrufe zu konstruieren, wie es von den veröffentlichten Standards argumentativ gefordert wird, anstatt ein value_type-Objekt emplacen.
operator[] ist nicht-const, da er den Schlüssel einfügt, wenn er nicht existiert. Wenn dieses Verhalten unerwünscht ist oder wenn 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 restlichen Memberfunktionen in geordneten und ungeordneten assoziativen Containern. (3) |
[bearbeiten] Beispiel
#include <iostream> #include <string> #include <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::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::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"; }
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'Defect reports
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 334 | C++98 | der Effekt von Überladung (1) war einfach die Rückgabe von (*((insert(std::make_pair(x, T()))).first)).second |
bereitstellte seine eigene Beschreibung stattdessen |
[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) |