Ich habe versucht, mit dem Operator [] auf das Element in einer const C ++ - Zuordnung zuzugreifen, aber diese Methode ist fehlgeschlagen. Ich habe auch versucht, "at ()" zu verwenden, um dasselbe zu tun. Diesmal hat es funktioniert. Ich konnte jedoch keine Referenz zur Verwendung von "at ()" für den Zugriff auf Elemente in einer const C ++ - Zuordnung finden. Ist "at ()" eine neu hinzugefügte Funktion in der C ++ - Map? Wo finde ich mehr Infos dazu? Vielen Dank!
Ein Beispiel könnte das folgende sein:
#include <iostream>
#include <map>
using namespace std;
int main()
{
map<int, char> A;
A[1] = 'b';
A[3] = 'c';
const map<int, char> B = A;
cout << B.at(3) << endl; // it works
cout << B[3] << endl; // it does not work
}
Bei Verwendung von "B [3]" wurden beim Kompilieren die folgenden Fehler zurückgegeben:
t01.cpp: 14: Fehler: Übergabe von 'const std :: map, std :: allocator >>' als 'dieses' Argument von '_Tp & std :: map <_Key, _Tp, _Compare, _Alloc> :: operator [] ( const _Key &) [mit _Key = int, _Tp = char, _Compare = std :: less, _Alloc = std :: allocator>] 'verwirft Qualifizierer
Der verwendete Compiler ist g ++ 4.2.1
at()
mit in VS2013 ein Projektset zur Verwendung des VS2010-Toolkits. Ich dachte, das bedeutet, dass ich C ++ 11 nicht benutze ... Aber es wird kompiliert ... ??Wenn ein Element in a nicht vorhanden ist
map
,operator []
wird es hinzugefügt - was in einerconst
Map offensichtlich nicht funktioniert, sodass C ++ keineconst
Version des Operators definiert. Dies ist ein schönes Beispiel für die Typprüfung des Compilers, die einen möglichen Laufzeitfehler verhindert.In Ihrem Fall müssen Sie
find
stattdessen ein Element verwenden, das nur dann ein (Iterator zum) Element zurückgibt, wenn es vorhanden ist. Das Element wird niemals geändertmap
. Wenn ein Element nicht vorhanden ist, gibt es einen Iterator an die Karte zurückend()
.at
existiert nicht und sollte nicht einmal kompilieren. Vielleicht ist dies eine "Compiler-Erweiterung" (=ein Käferneu in C ++ 0x).quelle
Der [] -Operator erstellt einen neuen Eintrag in der Karte, wenn der angegebene Schlüssel nicht vorhanden ist. Es kann somit die Karte ändern.
Siehe diesen Link .
quelle
Das überrascht mich sehr, aber die STL-Karte hat keinen
const
Indexoperator. Das heißt,B[3]
kann nicht schreibgeschützt sein. Aus dem Handbuch:Da operator [] möglicherweise ein neues Element in die Map einfügt, kann es möglicherweise keine const-Member-Funktion sein.
Ich habe keine Ahnung davon
at()
.quelle