El código que has enviado anterior funcionará correctamente suponiendo que Amap2
está vacía. Si intentas insert
un par clave/valor en un map
que ya tiene esa clave, se mantendrá el valor anterior y se descartará el nuevo. Por esa razón, si se escribe
Amap2.insert(Amap1.begin(), Amap1.end());
En algunas circunstancias, es posible que no copiar todos los objetos según lo previsto, porque las claves duplicadas no copiarán.
Para establecer Amap2
igual a Amap1
, consideran simplemente usando el operador de asignación:
Amap2 = Amap1;
Esto descartará ciegamente el contenido de Amap2
, sin embargo, así que tenga cuidado al hacer esto.
Si lo que quiere hacer es agregar todos los pares de clave/valor de Amap2
en Amap1
de manera que anule completamente los pares clave/valor existentes, puede hacerlo usando la siguiente lógica. La idea aquí es similar a la lógica detrás de mergesort - tratamos a los mapas como secuencias de valores ordenados y luego se mezcla de forma continua a los dos juntos:
void MergeMaps(map<int, A>& lhs, const map<int, A>& rhs) {
map<int, A>::iterator lhsItr = lhs.begin();
map<int, A>::const_iterator rhsItr = rhs.begin();
while (lhsItr != lhs.end() && rhsItr != rhs.end()) {
/* If the rhs value is less than the lhs value, then insert it into the
lhs map and skip past it. */
if (rhsItr->first < lhsItr->first) {
lhs.insert(lhsItr, *rhsItr); // Use lhsItr as a hint.
++rhsItr;
}
/* Otherwise, if the values are equal, overwrite the lhs value and move both
iterators forward. */
else if (rhsItr->first == lhsItr->first) {
lhsItr->second = rhsItr->second;
++lhsItr; ++rhsItr;
}
/* Otherwise the rhs value is bigger, so skip past the lhs value. */
else
++lhsItr;
}
/* At this point we've exhausted one of the two ranges. Add what's left of the
rhs values to the lhs map, since we know there are no duplicates there. */
lhs.insert(rhsItr, rhs.end());
}
Con esto, se puede escribir
MergeMaps(Amap1, Amap2);
Para copiar todos los pares clave/valor de Amap2
en Amap1
.
Espero que esto ayude!
@ Wolf: Ambos métodos se presentan en la respuesta. Esta es una comunidad editada colaborativamente, si desea agregar algo a la respuesta, siéntase libre de editarla. –
@ Wolf: no modifique sustancialmente las respuestas de otras personas, especialmente las que se escribieron CINCO años atrás, que ya han sido votadas por personas y aceptadas por el OP. Siéntase libre de escribir su propia respuesta competitiva. –
@LightnessRacesinOrbit Lo pedí y el OP me lo concedió explícitamente: * 'siéntase libre de editarlo' * – Wolf