how example ejemplo c++ stl map const

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



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.