2009-07-01 22 views
13

Ho due mappe:Come aggiungere i contenuti di una mappa a un'altra mappa?

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

ho popolato map1, ora voglio copiare il contenuto MAP1 in MAP2. Così ho semplicemente fatto:

ho un po 'operazione per la map1 riempie di

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

E ora devo compilare map2 con questo contenuto. E agian la mappa1 riempie con informazioni

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

Ora devo aggiungere questi contenuti a map2. Come faccio a fare questo?

+2

come accade che tu e l'utente Cute fai domande molto simili quasi negli stessi momenti ??? – sharptooth

+2

Ok, ma qual è il punto nel fare la domanda due volte? Uno di voi potrebbe porre la domanda e quindi entrambi potrebbero vedere le risposte. La duplicazione delle domande semplicemente diluisce lo sforzo della comunità e ottieni meno risposte positive. – sharptooth

+0

(Ho unito queste due domande identiche) –

risposta

3

Puoi farlo in diversi modi a seconda di cosa si vuole fare:

  1. Utilizzare il costruttore di copia:

    map< string, list <string> > map1; 
    // fill in map1 
    
    map< string, list <string> > map2(map1); 
    
  2. Utilizzare l'operatore di assegnazione, come si indica nella domanda:

    map< string, list <string> > map1; 
    map< string, list <string> > map2; 
    
    // fill in map1 
    
    map2 = map1; 
    
  3. fare tutto da soli manualmente:

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

Sembra che (1) è quello che volete.

+1

Vorrei aggiungere: std :: copy (map1.begin(), map1.end(), insert_iterator (map2, map2.begin()) è un altro modo –

+0

Mi aspettavo che questa fosse la risposta al primo scatto – Uday

7

È possibile utilizzare utilizzare il metodo di inserimento della mappa. Ad esempio:

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; cosa può indsi puoi dirmi .... – Cute

+0

E 'solo un esempio..it significa la chiave val: 1 mappe a valore 1 :-) – Naveen

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

Questo inserisce nel map1 gli elementi dall'inizio alla fine del map2. Questo metodo è di serie per tutte le strutture di dati STL, così si potrebbe anche fare qualcosa di simile

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

Inoltre, i puntatori possono anche funzionare come iteratori!

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

Consiglio vivamente di studiare la magia di STL e iteratori!

+0

Ricorda lo spazio tra i due '>>' :) – GManNickG

+1

Oh sì, alcuni compilatori si lamenteranno dei parametri del modello annidato (* cough * GCC), in quanto >> è simile a un operatore di estrazione del flusso. Quindi potresti aver bisogno di uno spazio nel mezzo. Vengo da un mondo Windows, però, e il compilatore in Visual Studio fa la cosa giusta. :) –

+0

buone informazioni - grazie! – AdamC

0

Penso che si desidera questo:

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

credo che sarà solo ignorare tutte le chiavi che già esistono nella destinazione. Se si desidera sovrascrivere i valori per le chiavi duplicate, è necessario eseguire iterazioni sugli elementi, inserirne uno, verificare la coppia di risultati e sostituire il valore.

Per il caso "Tre mappa", si avrebbe bisogno di:

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

Se si desidera inserire il tuo mappa come si definisce, questo è bello:

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