Namespaces
Variants

std::map<Key,T,Compare,Allocator>:: operator[]

From cppreference.net

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.
-
key_type muss die Anforderungen von CopyConstructible erfüllen.
-
mapped_type muss die Anforderungen von CopyConstructible und DefaultConstructible erfüllen.
Falls eine Einfügung durchgeführt wird, wird der zugeordnete Wert wertinitialisiert (für Klassentypen standardkonstruiert, andernfalls nullinitialisiert) und eine Referenz darauf zurückgegeben.
(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.
-
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.
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.
-
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.
(seit C++11)
3) Fügt ein value_type Objekt ein, das direkt vor Ort konstruiert wird, falls kein Schlüssel vorhanden ist, der transparent äquivalent zum Wert x verglichen wird.
Entspricht return this - > try_emplace ( std:: forward < K > ( x ) ) . first - > second ; . Diese Überladung nimmt nur dann an der Überladungsauflösung teil, wenn 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

1,2) Ein Verweis auf den zugeordneten Wert des neuen Elements, falls kein Element mit dem Schlüssel key existierte. Andernfalls ein Verweis auf den zugeordneten Wert des vorhandenen Elements, dessen Schlüssel äquivalent zu key ist.
3) Ein Verweis auf den zugeordneten Wert des neuen Elements, falls kein Element mit einem Schlüssel existierte, der äquivalent zum Wert x verglichen wird. Andernfalls ein Verweis auf den zugeordneten Wert des vorhandenen Elements, dessen Schlüssel äquivalent zu x verglichen wird.

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.

insert_or_assign liefert mehr Informationen als operator [ ] und erfordert keine Standardkonstruierbarkeit des zugeordneten Typs.

(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)
fügt ein Element ein oder weist dem aktuellen Element zu, falls der Schlüssel bereits existiert
(öffentliche Elementfunktion)
fügt direkt ein, falls der Schlüssel nicht existiert, tut nichts, falls der Schlüssel existiert
(öffentliche Elementfunktion)