2010-04-30 23 views
17

Vorrei copiare il contenuto di una std :: map in un'altra. Posso usare std::copy per quello? Ovviamente, il seguente codice non funzionerà:Come posso copiare una mappa in un'altra utilizzando std :: copy?

int main() { 
    typedef std::map<int,double> Map; 
    Map m1; 
    m1[3] = 0.3; 
    m1[5] = 0.5; 
    Map m2; 
    m2[1] = 0.1; 
    std::copy(m1.begin(), m1.end(), m2.begin()); 
    return 0; 
} 

Questo non funzionerà perché copy chiamerà operator* su m2.begin() a "dereference" e assegnare un valore (tutti i valori sono di tipo std::pair<const int, double>). Quindi chiamerà operator++ per passare allo spazio successivo in m2. Entrambe queste operazioni non funzionano a causa del const in const int e non c'è spazio riservato per eventuali nuovi elementi.

C'è un modo per farlo funzionare con std::copy?

Grazie!

risposta

59

È possibile utilizzare la risposta di GMan --- ma la domanda è, perché si desidera utilizzare std::copy? Dovresti invece usare la funzione membro std::map<k, v>::insert.

m2.insert(m1.begin(), m1.end()); 
+1

+1 In effetti, molto più pulito. – GManNickG

+1

Beh, se vuoi evitare di usare std :: copy, perché non usare semplicemente il copia c'tor? m2 = m1. modifica: Ah, vuole l'unione di valori. – Stephen

+2

@Stephen: Perché l'uso di 'insert' conserva i contenuti esistenti all'interno di' m2'. Usando l'operatore * assignment * distrugge i contenuti esistenti all'interno di 'm2'. –

19

È necessario una variante di un insert iterator:

std::copy(m1.begin(), m1.end(), std::inserter(m2, m2.end())); 

inserter è definito in <iterator>. Richiede un posto in cui inserire (da qui il m2.end()) e restituisce un insert_iterator.

+5

+1 per la risposta corretta, ma si preferiscono le funzioni membro alle chiamate di algoritmo. –

+0

+1 @GMan, +1 @Billy, voi ragazzi avete capito bene. L'OP dovrebbe fare quello che suggerisce Billy, ma in realtà GMan ha risposto alla domanda. Quindi, con i tuoi poteri combinati ... – wilhelmtell

+5

@WilhelmTell: I AM CAPTAIN PLANET! – GManNickG

Problemi correlati