Como posso percorrer um std::map
em C ++? Meu mapa é definido como:
std::map< std::string, std::map<std::string, std::string> >
Por exemplo, o contêiner acima contém dados como este:
m["name1"]["value1"] = "data1";
m["name1"]["value2"] = "data2";
m["name2"]["value1"] = "data1";
m["name2"]["value2"] = "data2";
m["name3"]["value1"] = "data1";
m["name3"]["value2"] = "data2";
Como posso percorrer este mapa e acessar os vários valores?
Respostas:
Pergunta antiga, mas as respostas restantes estão desatualizadas no C ++ 11 - você pode usar um loop for de longo alcance e simplesmente fazer:
isso deve ser muito mais limpo que as versões anteriores e evita cópias desnecessárias.
Alguns preferem substituir os comentários por definições explícitas de variáveis de referência (que são otimizadas se não utilizadas):
fonte
const
depoisauto
? É puramente estético?int const *x
eint *const x
você pode escrevê-lo comoint const *const x
IMO muito mais claro queconst int *const x
. Mas é apenas analisado da esquerda para a direita, para que o efeito seja o mesmo. Veja as respostas para esta pergunta: stackoverflow.com/questions/5503352/const-before-or-const-afterVocê pode usar um iterador.
fonte
for(auto iterator = m.begin(); iterator != m.end(); iterator++)
ou melhor em C ++ 0x:
fonte
Com o C ++ 17 (ou posterior), você pode usar o recurso "ligações estruturadas", que permite definir várias variáveis, com nomes diferentes, usando uma única tupla / par. Exemplo:
A proposta original (dos luminares Bjarne Stroustrup, Herb Sutter e Gabriel Dos Reis) é divertida de ler (e a sintaxe sugerida é o IMHO mais intuitivo); há também a redação proposta para o padrão, que é chata de ler, mas está mais próxima do que realmente vai acontecer.
fonte
Faça algo parecido com isto:
fonte
C ++ 11:
resultado:
fonte
use
std::map< std::string, std::map<std::string, std::string> >::const_iterator
quando o mapa for const.fonte
auto
mano, ou quem usa vim vai KO.Como o einpoklum mencionado na resposta , desde o C ++ 17 você também pode usar declarações de ligação estruturada . Quero estender isso fornecendo uma solução completa para iterar sobre um mapa de mapas de uma maneira confortável:
Nota 1: Para preencher o mapa, usei uma lista de inicializadores (que é um recurso do C ++ 11 ). Às vezes, isso pode ser útil para manter as inicializações fixas compactas.
Nota 2: se você deseja modificar o mapa
m
dentro dos loops, é necessário remover asconst
palavras - chave.Código em Coliru
fonte
A primeira solução é usar o range_based para loop, como:
Nota: Quando
range_expression
's tipo éstd::map
, em seguida, umrange_declaration
' s tipo éstd::pair
.Código 1:
A segunda solução:
Código 2
fonte