Solo necesito diccionario o matriz asociativa string
=> int
.
Hay un mapa de tipos C ++ para este caso.
Pero solo necesito un mapa para todas las instancias (-> estático) y este mapa no se puede cambiar (-> const);
He encontrado esta manera con la biblioteca boost
std::map<int, char> example =
boost::assign::map_list_of(1, 'a') (2, 'b') (3, 'c');
¿Hay otra solución sin esta lib? He intentado algo como esto, pero siempre hay algunos problemas con la inicialización del mapa.
class myClass{
private:
static map<int,int> create_map()
{
map<int,int> m;
m[1] = 2;
m[3] = 4;
m[5] = 6;
return m;
}
static map<int,int> myMap = create_map();
};
v = k + 'a' - 1
.Respuestas:
fuente
Boost.Assign
diseño similar también es bastante bueno :)cout << A::myMap[1];
enmain()
. Da un error. El error no ocurre si elimino losconst
calificadores, por lo que supongo que los mapasoperator[]
no pueden manejarconst map
, al menos, no en la implementación g ++ de la biblioteca C ++.const_map.cpp:22:23: error: passing ‘const std::map<int, int>’ as ‘this’ argument of ‘std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const key_type&) [with _Key = int; _Tp = int; _Compare = std::less<int>; _Alloc = std::allocator<std::pair<const int, int> >; std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type = int; std::map<_Key, _Tp, _Compare, _Alloc>::key_type = int]’ discards qualifiers [-fpermissive]
El estándar C ++ 11 introdujo la inicialización uniforme que lo hace mucho más simple si su compilador lo admite:
Consulte también esta sección de Professional C ++ , en unordered_maps.
fuente
¡Lo hice! :)
Funciona bien sin C ++ 11
fuente
Si lo encuentra
boost::assign::map_list_of
útil, pero no puede usarlo por alguna razón, puede escribir el suyo propio :Es útil saber cómo funcionan estas cosas, especialmente cuando son tan cortas, pero en este caso usaría una función:
a.hpp
a.cpp
fuente
Un enfoque diferente al problema:
Esto es más eficiente, ya que no hay una copia de un tipo de pila a pila (incluido el constructor y los destructores de todos los elementos). Si esto importa o no depende de su caso de uso. ¡No importa con cuerdas! (pero puede que encuentre esta versión "más limpia" o no)
fuente
Si el mapa va a contener solo entradas que se conocen en el momento de la compilación y las claves del mapa son números enteros, entonces no es necesario utilizar un mapa en absoluto.
fuente
switch
embargo, eso es horrible. ¿Por qué noreturn key + 'a' - 1
?return key + 'a' - 1
no funcionaría para su mapeo real.Puedes probar esto:
MyClass.h
MyClass.cpp
Con esta implementación, su mapa estático constante de clases es un miembro privado y puede ser accesible para otras clases usando un método get público. De lo contrario, dado que es constante y no puede cambiar, puede eliminar el método public get y mover la variable del mapa a la sección pública de clases. Sin embargo, dejaría el método createMap privado o protegido si se requiere herencia o polimorfismo. A continuación se muestran algunos ejemplos de uso.
Había editado mi publicación original, no había nada de malo con el código original en el que publiqué para que se compilara, construyera y ejecutara correctamente, era solo que en mi primera versión presenté como respuesta el mapa fue declarado como público y el mapa fue const pero no estático.
fuente
Si está utilizando un compilador que aún no admite la inicialización universal o tiene reservas para usar Boost, otra alternativa posible sería la siguiente
fuente
Una llamada a función no puede aparecer en una expresión constante.
prueba esto: (solo un ejemplo)
fuente
static map<int,int> myMap = create_map();
es incorrecto.struct testdata { testdata(int){} }; struct test { static const testdata td = 5; }; testdata test::td;
no se podrá compilar incluso si la inicialización se realiza con una expresión constante (5
). Es decir, la 'expresión constante' es irrelevante para la corrección (o falta de ella) del código inicial.A menudo uso este patrón y te recomiendo que lo uses también:
Seguro que no es muy legible, pero sin otras librerías es lo mejor que podemos hacer. Además, no habrá operaciones redundantes como copiar de un mapa a otro como en su intento.
Esto es aún más útil dentro de las funciones: en lugar de:
Utilice lo siguiente:
No solo ya no es necesario que esté aquí para tratar con la variable booleana, sino que ya no tendrá una variable global oculta que se verifique si el inicializador de la variable estática dentro de la función ya se llamó.
fuente