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 key oder x entspricht, wobei eine Einfügung durchgeführt wird, falls ein solcher Schlüssel noch nicht existiert.
|
1)
Fügt
value_type
(
key, T
(
)
)
ein, falls der Schlüssel nicht existiert.
|
(bis C++11) | ||||||
|
1)
Fügt ein
value_type
-Objekt ein, das direkt erstellt wird aus
std::
piecewise_construct
,
std::
forward_as_tuple
(
key
)
,
std::
tuple
<>
(
)
falls der Schlüssel nicht existiert.
Entspricht
return
this
-
>
try_emplace
(
key
)
.
first
-
>
second
;
.
(seit C++17)
Bei Verwendung des Standard-Allokators führt dies dazu, dass der Schlüssel aus
key
kopierkonstruiert wird und der zugeordnete Wert
wertinitialisiert
wird.
2)
Fügt ein
value_type
-Objekt ein, das direkt vor Ort konstruiert wird aus
std::
piecewise_construct
,
std::
forward_as_tuple
(
std
::
move
(
key
)
)
,
std::
tuple
<>
(
)
falls der Schlüssel nicht existiert.
Entspricht
return
this
-
>
try_emplace
(
std
::
move
(
key
)
)
.
first
-
>
second
;
.
(seit C++17)
Bei Verwendung des Standard-Allokators führt dies dazu, dass der Schlüssel aus
key
move-konstruiert wird und der zugeordnete Wert
wertinitialisiert
wird.
|
(seit C++11) | ||||||
value_type
Objekt ein, das direkt vor Ort konstruiert wird, falls kein Schlüssel vorhanden ist, der transparent
äquivalent
zum Wert
x
verglichen wird.
Compare
transparent
ist. Sie erlaubt den Aufruf dieser Funktion ohne Konstruktion einer Instanz von
Key
.
Keine Iteratoren oder Referenzen werden ungü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
Logarithmisch in der Größe des Containers.
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
behoben, 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 | Feature |
|---|---|---|---|
__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 <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; // 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::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"; }
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'
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 334 | C++98 |
die Wirkung der Überladung
(1)
war einfach das Zurückgeben von
( * ( ( insert ( std:: make_pair ( x, T ( ) ) ) ) . first ) ) . second |
stellte eine eigene
Beschreibung bereit |
Siehe auch
|
greift auf spezifisches Element mit Grenzprüfung zu
(ö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) |