Zugriff auf Elemente in einer Const Map mit Operator[] vs. at()
Beim Arbeiten mit einer Konstanten std::map, Zugriff Elemente, die den Operator[] verwenden, können problematisch sein. Obwohl die Verwendung dieser Methode intuitiv erscheinen mag, schlägt die Kompilierung fehl. Dies liegt daran, dass der Operator[] erwartet, dass eine nicht konstante Karte die Karte ändert, wenn der Schlüssel nicht vorhanden ist.
Es gibt jedoch eine alternative Methode, at(), die in C 11 speziell für eingeführt wurde diesen Zweck. Im Gegensatz zu Operator[] löst at() eine std::out_of_range-Ausnahme aus, wenn der Schlüssel nicht existiert, anstatt ein standardmäßig konstruiertes Element einzufügen.
Dieses Verhalten passt gut zum Konzept einer Konstantenzuordnung. Durch die Definition einer const-Überladung von at() wird ein sicherer und effizienter Zugriff auf Elemente ohne die Möglichkeit unbeabsichtigter Änderungen ermöglicht.
Betrachten Sie zur Veranschaulichung das folgende Beispiel:
#include <iostream> #include <map> int main() { std::map<int, char> A; A[1] = 'b'; A[3] = 'c'; const std::map<int, char> B = A; std::cout << B.at(3) << std::endl; // works std::cout << B[3] << std::endl; // cannot access (compile error) }
In In diesem Szenario würde die Verwendung von „operator[]“ auf B zu einem Fehler bei der Kompilierung führen, da es sich um eine konstante Zuordnung handelt und nicht geändert werden kann. Die at()-Methode funktioniert jedoch perfekt, da sie die konstante Natur der Karte kennt und eine Ausnahme auslöst, wenn der Schlüssel nicht existiert.
Daher gilt für den Zugriff auf Elemente in einer const std::map: at() ist der empfohlene und sicherere Ansatz, um unbeabsichtigte Änderungen zu verhindern. Weitere Informationen zu dieser Funktion finden Sie im C 11-Standard oder in der Dokumentation zur Klasse std::map.
Das obige ist der detaillierte Inhalt vonConst std::map Zugriff: „operator[]' vs. „at()' – Was sollten Sie verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!