c++ - how - Combinar dos mapas STL
map c++ pair (4)
¿Cómo puedo combinar dos mapas STL en uno? Ambos tienen los mismos tipos de valor clave (mapa). Si hay superposición de las teclas, me gustaría dar preferencia a uno de los mapas.
De acuerdo con ISO / IEC 14882: 2003, sección 23.1.2, Tabla 69, expresión a.insert (i, j):
pre: i, j no son iteradores en a. inserta cada elemento del rango [i, j) si y solo si no hay ningún elemento con una clave equivalente a la clave de ese elemento en contenedores con claves únicas;
Dado que std :: map debe seguir esta restricción, si desea dar preferencia a los "valores" de un mapa sobre otro, debe insertarlo. Por ejemplo,
std::map<int, int> goodKeys;
std::map<int, int> betterKeys;
betterKeys.insert(goodKeys.begin(), goodKeys.end());
Entonces, si hay claves equivalentes en goodKeys y betterKeys, se conservarán los "valores" de betterKeys.
Si desea copiar entradas de un mapa a otro, puede usar la insert
std::map
:
targetMap.insert(sourceMap.begin(), sourceMap.end());
Pero tenga en cuenta que la insert
no actualiza los elementos si su clave ya está en targetMap; esos artículos se dejarán como están. Para sobrescribir elementos, deberá copiarlos explícitamente, por ejemplo:
for(auto& it : sourceMap)
{
targetMap[it.first] = it.second;
}
Si no te importa perder los datos en sourceMap
, otra forma de lograr una copia y sobrescritura es insert
el destino en el origen y std::swap
los resultados:
sourceMap.insert(targetMap.begin(), targetMap.end());
std::swap(sourceMap, targetMap);
Después del intercambio, sourceMap
contendrá los datos antiguos de targetMap
, y targetMap
será una fusión de los dos mapas, con preferencia por las entradas de sourceMap
.
Suponiendo que desea conservar los elementos en mapA, y fusionar elementos en mapB para los cuales no hay clave en mapA:
mapA.insert(mapB.begin(), mapB.end())
hará lo que quieras, creo.
EDITAR: agregar un ejemplo de trabajo
#include <iostream>
#include <map>
void printIt(std::map<int,int> m) {
for(std::map<int,int>::iterator it=m.begin();it!=m.end();++it)
std::cout << it->first<<":"<<it->second<<" ";
std::cout << "/n";
}
int main() {
std::map<int,int> foo,bar;
foo[1] = 11; foo[2] = 12; foo[3] = 13;
bar[2] = 20; bar[3] = 30; bar[4] = 40;
printIt(foo);
printIt(bar);
foo.insert(bar.begin(),bar.end());
printIt(foo);
return 0;
}
salida:
:!./insert
1:11 2:12 3:13
2:20 3:30 4:40
1:11 2:12 3:13 4:40
Tenga en cuenta que, desde C ++ 17, hay un método merge()
para los mapas.