2009-07-01 7 views
13

J'ai deux cartes:Comment ajouter le contenu d'une carte à une autre carte?

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

Je peuplé map1, maintenant je veux copier le contenu de la carte1 dans map2. Donc, je simplement fait:

j'ai une certaine opération pour que le map1 remplit

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

Et maintenant je dois remplir map2 avec ce contenu. Et planifions le map1 remplit avec les informations

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

Maintenant, je dois ajouter à ces contenus map2. Comment puis-je faire cela?

+2

Comment se fait-il que vous et l'utilisateur Mignon poser des questions très similaires à peu près au même moment ??? – sharptooth

+2

D'accord, mais à quoi bon poser la question deux fois? L'un d'entre vous pourrait poser la question et tous les deux pourraient voir les réponses. La duplication des questions ne fait que diluer l'effort communautaire et vous obtenez moins de bonnes réponses. – sharptooth

+0

(J'ai fusionné ces deux questions identiques) –

Répondre

3

Vous pouvez le faire de plusieurs façons en fonction de ce que vous voulez faire:

  1. Utilisez le constructeur de copie:

    map< string, list <string> > map1; 
    // fill in map1 
    
    map< string, list <string> > map2(map1); 
    
  2. Utilisez l'opérateur d'affectation que vous indiquez dans la question:

    map< string, list <string> > map1; 
    map< string, list <string> > map2; 
    
    // fill in map1 
    
    map2 = map1; 
    
  3. Faites-vous tout manuellement:

    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(); 
    } 
    

On dirait que (1) est ce que vous voulez.

+1

Je voudrais ajouter: std :: copy (map1.begin(), map1.end(), insert_iterator (map2, map2.begin()) est une autre façon –

+0

Je m'attendais à ce que ce soit la réponse au premier coup – Uday

7

Vous pouvez utiliser la méthode insert de la carte. Par exemple:

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'est-ce qu'il indiates pouvez-vous me dire pz .... – Cute

+0

Son juste un exemple .. il signifie la clé val: 1 cartes à la valeur 1 :-) – Naveen

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

Cela insérer dans map1 les éléments du début à la fin de map2. Cette méthode est standard pour toutes les structures de données STL, vous pourriez même faire quelque chose comme

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

De plus, les pointeurs peuvent également fonctionner comme itérateurs!

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

Recommande fortement d'étudier la magie du STL et des itérateurs!

+0

Rappelez-vous l'espace entre les deux '>>' :) – GManNickG

+1

Oh oui, certains compilateurs vont se plaindre des paramètres de modèles imbriqués (* toux * GCC), car le >> ressemble à un opérateur d'extraction de flux. Vous aurez peut-être besoin d'un espace au milieu. Je viens d'un monde Windows, cependant, et le compilateur dans Visual Studio fait la bonne chose. :) –

+0

bonne info - merci! – AdamC

0

Je pense que vous voulez ceci:

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

Je pense que cela va simplement ignorer toutes les clés qui existent déjà dans la cible. Si vous souhaitez écraser des valeurs pour des clés dupliquées, vous devez parcourir les éléments, les insérer, tester la paire de résultats et remplacer la valeur.

Pour les « trois carte » cas, vous devez:

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

Si vous souhaitez insérer votre carte que vous définissez, c'est agréable:

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