Eu preciso apenas de um dicionário ou array associativo string
=> int
.
Existe um mapa de tipos C ++ para este caso.
Mas eu preciso de apenas um mapa para todas as instâncias (-> estático) e este mapa não pode ser alterado (-> const);
Eu descobri essa maneira com a biblioteca boost
std::map<int, char> example =
boost::assign::map_list_of(1, 'a') (2, 'b') (3, 'c');
Existe outra solução sem esta lib? Eu tentei algo assim, mas sempre há alguns problemas com a inicialização do 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
.Respostas:
fonte
Boost.Assign
design semelhante é muito legal também :)cout << A::myMap[1];
emmain()
. Isso dá um erro. O erro não ocorre se eu remover osconst
qualificadores, então eu acho que o mapaoperator[]
não consegue lidar comconst map
, pelo menos, não na implementação g ++ da 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]
O padrão C ++ 11 introduziu a inicialização uniforme, o que torna isso muito mais simples se o seu compilador for compatível:
Veja também esta seção do Professional C ++ , em unordered_maps.
fonte
Eu fiz isso! :)
Funciona bem sem C ++ 11
fonte
Se você achar
boost::assign::map_list_of
útil, mas não puder usá-lo por algum motivo, poderá escrever o seu próprio :É útil saber como essas coisas funcionam, especialmente quando são tão curtas, mas neste caso eu usaria uma função:
a.hpp
a.cpp
fonte
Uma abordagem diferente para o problema:
Isso é mais eficiente, pois não há cópia de um tipo da pilha para a pilha (incluindo construtor, destruidores em todos os elementos). Se isso é importante ou não, depende do seu caso de uso. Não importa com cordas! (mas você pode ou não achar esta versão "mais limpa")
fonte
Se o mapa deve conter apenas entradas conhecidas em tempo de compilação e as chaves do mapa são inteiros, você não precisa usar um mapa.
fonte
switch
é horrível. Porque nãoreturn key + 'a' - 1
?return key + 'a' - 1
isso não funcionaria para seu mapeamento real.Você pode tentar isto:
MyClass.h
MyClass.cpp
Com essa implementação, o mapa estático constante de suas classes é um membro privado e pode ser acessado por outras classes usando um método get público. Caso contrário, uma vez que é constante e não pode mudar, você pode remover o método get público e mover a variável de mapa para a seção pública de classes. No entanto, eu deixaria o método createMap privado ou protegido se herança e / ou polimorfismo forem necessários. Aqui estão alguns exemplos de uso.
Eu havia editado minha postagem original, não havia nada de errado com o código original em que postei compilado, construído e executado corretamente, só que minha primeira versão que apresentei como resposta o mapa foi declarado como público e o mapa foi const, mas não estático.
fonte
Se você estiver usando um compilador que ainda não suporta a inicialização universal ou você tem reservas em usar Boost, outra alternativa possível seria a seguinte
fonte
Uma chamada de função não pode aparecer em uma expressão constante.
tente isto: (apenas um exemplo)
fonte
static map<int,int> myMap = create_map();
está incorreto.struct testdata { testdata(int){} }; struct test { static const testdata td = 5; }; testdata test::td;
ela não conseguirá compilar, mesmo se a inicialização for realizada com uma expressão constante (5
). Ou seja, 'expressão constante' é irrelevante para a exatidão (ou falta dela) do código inicial.Costumo usar esse padrão e recomendo que você também o use:
Claro que não é muito legível, mas sem outras bibliotecas, é o melhor que podemos fazer. Além disso, não haverá nenhuma operação redundante, como copiar de um mapa para outro, como em sua tentativa.
Isso é ainda mais útil dentro das funções: Em vez de:
Use o seguinte:
Não apenas você não precisa mais lidar com a variável booleana, você não terá uma variável global oculta que é verificada se o inicializador da variável estática dentro da função já foi chamado.
fonte