¿Cómo puedo recorrer un std::map
en 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
const
despuésauto
? ¿Es puramente estético?int const *x
yint *const x
puede escribirlo comoint const *const x
IMO 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_iterator
cuando el mapa es constante.fuente
auto
hermano, 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
m
dentro de los bucles, debe eliminar elconst
palabras clave.Código en Coliru
fuente
La primera solución es usar range_based for loop, como:
Nota: Cuando
range_expression
el tipo esstd::map
entoncesrange_declaration
, el tipo esstd::pair
.Código 1:
La segunda solución:
Código 2
fuente