2009-07-01 16 views
13

Tengo dos mapas:¿Cómo adjuntar los contenidos de un mapa a otro mapa?

map< string, list <string> > map1; 
map< string, list <string> > map2; 

He poblado map1, ahora quiero copiar el contenido Map1 en map2. Por lo que simplemente lo hizo:

tengo alguna operación para que el map1 llena de

1. kiran, c:\pf\kiran.mdf, c:\pf\kiran.ldf 
2. test, c:\pf\test.mdf, c:\pf\test.mdf 

Y ahora tengo que llenar map2 con este contenido. Y nuevo del map1 llena de información

1. temp, c:\pf\test.mdf, c:\pf\test.ldf 
2. model, c:\model\model.mdf, c:\pf\model.ldf 

Ahora tengo que añadir estos contenidos a map2. ¿Cómo hago esto?

+2

¿Cómo es posible que tú y el usuario Cute hacen preguntas muy similares en casi los mismos momentos ??? – sharptooth

+2

Bien, pero ¿cuál es el sentido de hacer la pregunta dos veces? Uno de ustedes podría hacer la pregunta y luego ambos podrían ver las respuestas. La duplicación de preguntas solo diluye el esfuerzo de la comunidad y obtienes menos respuestas buenas. – sharptooth

+0

(He fusionado estas dos preguntas idénticas) –

Respuesta

3

Puede hacerlo de varias maneras dependiendo de lo que desee hacer:

  1. Utilice el constructor de copia:

    map< string, list <string> > map1; 
    // fill in map1 
    
    map< string, list <string> > map2(map1); 
    
  2. usar el operador de asignación como se indica en la pregunta:

    map< string, list <string> > map1; 
    map< string, list <string> > map2; 
    
    // fill in map1 
    
    map2 = map1; 
    
  3. hacerlo todo usted mismo de forma manual:

    map< string, list <string> > map1; 
    map< string, list <string> > map2; 
    
    // fill in map1 
    
    for (map< string, list <string> >::iterator i = map1.begin(); 
        i <= map1.end(); ++i) { 
        map2[i.first()] = i.second(); 
    } 
    

Parece que (1) es lo que desea.

+1

Me gustaría agregar: std :: copy (map1.begin(), map1.end(), insert_iterator (map2, map2.begin()) es otra forma –

+0

Esperaba que esta fuera la respuesta en el primer disparo – Uday

7

Puede usar el método de inserción del mapa. Por ejemplo:

std::map<int, int> map1; 
    std::map<int, int> map2; 

    map1[1] = 1; 

    map2.insert(map1.begin(), map1.end()); 
    map1.clear(); 

    map1[2] =2; 
    map2.insert(map1.begin(), map1.end()); 
+0

map1 [1] = 1; ¿Qué significa? Puede decirme ... – Cute

+0

Es solo un ejemplo ... significa que la clave val: 1 se asigna al valor 1 :-) – Naveen

40
map<int,int> map1; 
map<int,int> map2; 
map1.insert(map2.begin(), map2.end()); 

Esto insertar en map1 los elementos desde el principio hasta el final de map2. Este método es estándar para toda la estructura de datos STL, por lo que incluso podría hacer algo como

map<int,int> map1; 
vector<pair<int,int>> vector1; 
vector1.insert(map1.begin(), map1.end()); 

Por otra parte, los punteros también puede funcionar como iteradores!

char str1[] = "Hello world"; 
string str2; 
str2.insert(str1, str1+strlen(str1)); 

¡Recomiendo encarecidamente estudiar la magia del STL y los iteradores!

+0

Recuerde el espacio entre los dos '>>' :) – GManNickG

+1

Oh sí, ciertos compiladores se quejarán de los parámetros de plantilla anidados (* tos * GCC), ya que >> se parece a un operador de extracción de flujo. Entonces puede que necesites un espacio en el medio. Sin embargo, vengo del mundo de Windows y el compilador de Visual Studio hace lo correcto. :) –

+0

buena información - gracias! – AdamC

0

Creo que quieres esto:

mapb.insert(mapa.begin(), mapa.end()); 

creo que simplemente se saltará ninguna tecla que ya existen en el objetivo. Si desea sobreescribir valores para claves duplicadas, debe iterar sobre los elementos, insertar cada uno, probar el par de resultados y reemplazar el valor.

Para el caso "Tres mapa", que tendría que:

mapc.insert(mapa.begin(), mapa.end()); 
mapc.insert(mapb.begin(), mapb.end()); 
0

Si desea insertar el mapa a medida que lo define, esto es agradable:

payload.insert({ 
      { "key1", "one" }, 
      { "key2", 2 }, 
     }); 
Cuestiones relacionadas