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:
int main() {
std::map<std::string, std::map<std::string, std::string>> m {
{"name1", {{"value1", "data1"}, {"value2", "data2"}}},
{"name2", {{"value1", "data1"}, {"value2", "data2"}}},
{"name3", {{"value1", "data1"}, {"value2", "data2"}}}
};
for (const auto& [k1, v1] : m)
for (const auto& [k2, v2] : v1)
std::cout << "m[" << k1 << "][" << k2 << "]=" << v2 << std::endl;
return 0;
}
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 as const
palavras - chave.
Código em Coliru