2010-04-30 14 views
17

Me gustaría copiar el contenido de un std :: map en otro. ¿Puedo usar std::copy para eso? Obviamente, el siguiente código no funcionará:¿Cómo puedo copiar un mapa en otro usando 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; 
} 

Esto no funcionará porque copy llamarán operator* en m2.begin() a "eliminar la referencia" y asignar un valor (todos los valores son de tipo std::pair<const int, double>). Luego llamará al operator++ para pasar al siguiente espacio en m2. Ambas operaciones no funcionan debido al const en const int y no hay espacio reservado para ningún elemento nuevo.

¿Hay alguna manera de hacerlo funcionar con std::copy?

Gracias!

Respuesta

59

Puede usar la respuesta de GMan --- pero la pregunta es, ¿por qué desea usar std::copy? Debería usar la función de miembro std::map<k, v>::insert en su lugar.

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

+1 De hecho, mucho más limpio. – GManNickG

+1

Bueno, si vas a evitar el uso de std :: copy, ¿por qué no utilizar el copy c'tor? m2 = m1. editar: Ah, él quiere la unión de valores. – Stephen

+2

@Stephen: Porque el uso de 'insert' conserva los contenidos existentes dentro de' m2'. El uso del operador copy * assignment * destruye los contenidos existentes dentro de 'm2'. –

19

Usted necesita una variante de un insert iterator:

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

inserter se define en <iterator>. Requiere un lugar para insertar (de ahí el m2.end()) y devuelve un insert_iterator.

+5

+1 para una respuesta correcta, pero se deben preferir las funciones de miembro a las llamadas de algoritmo. –

+0

+1 @GMan, +1 @Billy, ustedes dos lo hicieron bien. El OP debería hacer lo que sugiere Billy, pero GMan de hecho respondió la pregunta. Entonces, con tus poderes combinados ... – wilhelmtell

+5

@WilhelmTell: ¡YO SOY CAPITÁN PLANETA! – GManNickG

Cuestiones relacionadas