Intenté usar el operador [] para acceder al elemento en un mapa constante de C ++, pero este método falló. También intenté usar "at ()" para hacer lo mismo. Funcionó esta vez. Sin embargo, no pude encontrar ninguna referencia sobre el uso de "at ()" para acceder al elemento en un mapa constante de C ++. ¿Es "at ()" una función recién agregada en el mapa C ++? ¿Dónde puedo encontrar más información sobre esto? ¡Muchas gracias!
Un ejemplo podría ser el siguiente:
#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
}
Para usar "B [3]", devolvió los siguientes errores durante la compilación:
t01.cpp: 14: error: pasar 'const std :: map, std :: allocator>>' como 'este' argumento de '_Tp & std :: map <_Key, _Tp, _Compare, _Alloc> :: operator [] ( const _Key &) [con _Key = int, _Tp = char, _Compare = std :: less, _Alloc = std :: allocator>] 'descarta los calificadores
El compilador utilizado es g ++ 4.2.1
at()
en VS2013 en un proyecto configurado para usar el kit de herramientas VS2010. Pensé que eso significaba que no estaba usando C ++ 11 ... ¿Pero aún se compila ... ??Si un elemento no existe en a
map
,operator []
lo agregará, lo que obviamente no puede funcionar en unconst
mapa, por lo que C ++ no define unaconst
versión del operador. Este es un buen ejemplo del verificador de tipos del compilador que evita un posible error en tiempo de ejecución.En su caso, debe usar
find
en su lugar, que solo devolverá un (iterador al) elemento si existe, nunca modificará elmap
. Si un elemento no existe, devuelve un iterador al mapaend()
.at
no existe y ni siquiera debería compilarse. Quizás esta sea una "extensión del compilador" (=un insectonuevo en C ++ 0x).fuente
El operador [] creará una nueva entrada en el mapa si la clave dada no existe. Por tanto, puede cambiar el mapa.
Vea este enlace .
fuente
Esto me sorprende bastante, pero el mapa STL no tiene un
const
operador de índice. Es decir,B[3]
no puede ser de solo lectura. Del manual:Dado que el operador [] podría insertar un nuevo elemento en el mapa, no es posible que sea una función miembro constante.
No tengo ni idea
at()
.fuente