example - map c++ pair
C++ const acceso al elemento de mapa (4)
Intenté usar el operador [] para acceder al elemento en un mapa const C ++, pero este método falló. También traté de 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 const C ++. ¿Está "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
El operador [] creará una nueva entrada en el mapa si la clave dada no existe. Por lo tanto, puede cambiar el mapa.
Ver este enlace
Esto es una gran sorpresa para mí, pero el mapa STL no tiene un operador de índice const
. Es decir, B[3]
no puede ser de solo lectura. Del manual:
No tengo idea sobre at()
.
Si un elemento no existe en un map
, el operator []
lo agregará, lo que obviamente no puede funcionar en un mapa const
así que C ++ no define una versión const
del operador. Este es un buen ejemplo del verificador de tipos del compilador que evita un posible error de tiempo de ejecución.
En su caso, debe usar find
lugar, que solo devolverá un elemento (iterador al) si existe, nunca modificará el map
. Si un elemento no existe, devuelve un iterador al end()
del mapa end()
.
at
no existe y ni siquiera debería compilarse. Quizás esta es una "extensión del compilador" (= un insecto nuevo en C ++ 0x).
at()
es un nuevo método para std::map
en C ++ 11.
En lugar de insertar un nuevo elemento construido por defecto como operator[]
si un elemento con la clave dada no existe, arroja una excepción std::out_of_range
. (Esto es similar al comportamiento de at()
para deque
y vector
.)
Debido a este comportamiento, tiene sentido que exista una sobrecarga const
de at()
, a diferencia del operator[]
que siempre tiene el potencial de cambiar el mapa.