values how example c++ stl maps

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.