¿Cómo puedo recorrer un std::mapen C ++? Mi mapa se define como:
std::map< std::string, std::map<std::string, std::string> >
Por ejemplo, el contenedor anterior contiene datos 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";
¿Cómo puedo recorrer este mapa y acceder a los distintos valores?

Respuestas:
Pregunta anterior, pero las respuestas restantes están desactualizadas a partir de C ++ 11: puede usar un bucle basado en rango para simplemente y hacer lo siguiente:
Esto debería ser mucho más limpio que las versiones anteriores, y evita copias innecesarias.
Algunos prefieren reemplazar los comentarios con definiciones explícitas de variables de referencia (que se optimizan si no se usan):
fuente
constdespuésauto? ¿Es puramente estético?int const *xyint *const xpuede escribirlo comoint const *const xIMO mucho más claro queconst int *const x. Pero solo se analiza de izquierda a derecha, por lo que el efecto es el mismo. Vea las respuestas a esta pregunta: stackoverflow.com/questions/5503352/const-before-or-const-afterPuedes usar un iterador.
fuente
for(auto iterator = m.begin(); iterator != m.end(); iterator++)o mejor en C ++ 0x:
fuente
Con C ++ 17 (o posterior), puede usar la función de "enlaces estructurados", que le permite definir múltiples variables, con diferentes nombres, usando una sola tupla / par. Ejemplo:
La propuesta original (de las luminarias Bjarne Stroustrup, Herb Sutter y Gabriel Dos Reis) es divertida de leer (y la sintaxis sugerida es más intuitiva en mi humilde opinión); También está la redacción propuesta para el estándar que es aburrido de leer pero está más cerca de lo que realmente entrará.
fuente
Haz algo como esto:
fuente
C ++ 11:
salida:
fuente
usar
std::map< std::string, std::map<std::string, std::string> >::const_iteratorcuando el mapa es constante.fuente
autohermano, o el que usa vim irá KO.Como einpoklum mencionó en su respuesta , desde C ++ 17 también puede usar declaraciones de enlace estructurado . Quiero ampliar eso proporcionando una solución completa para iterar sobre un mapa de mapas de una manera cómoda:
Nota 1: para llenar el mapa, utilicé una lista de inicializadores (que es un C ++ 11 ). Esto a veces puede ser útil para mantener las inicializaciones fijas compactas.
Nota 2: si desea modificar el mapa
mdentro de los bucles, debe eliminar elconstpalabras clave.Código en Coliru
fuente
La primera solución es usar range_based for loop, como:
Nota: Cuando
range_expressionel tipo esstd::mapentoncesrange_declaration, el tipo esstd::pair.Código 1:
La segunda solución:
Código 2
fuente