C++17
Comme mentionné dans Réponse de John Perry puisque C++17 std::map
fournit un merge()
fonction membre. Le site merge()
produit le même résultat pour la carte cible que la fonction La solution de jkerian sur la base de l'utilisation insert()
comme vous pouvez le voir dans l'exemple suivant, que j'ai emprunté à jkerian. J'ai juste mis à jour le code avec quelques C++11 et les caractéristiques de C++17 (telles que using
alias de type , boucle for basée sur la gamme con liaison structurée et initialisation de la liste ):
using mymap = std::map<int, int>;
void printIt(const mymap& m) {
for (auto const &[k, v] : m)
std::cout << k << ":" << v << " ";
std::cout << std::endl;
}
int main() {
mymap foo{ {1, 11}, {2, 12}, {3, 13} };
mymap bar{ {2, 20}, {3, 30}, {4, 40} };
printIt(foo);
printIt(bar);
foo.merge(bar);
printIt(foo);
return 0;
}
Sortie :
1:11 2:12 3:13
2:20 3:30 4:40
1:11 2:12 3:13 4:40
Comme vous pouvez le voir, merge()
donne également la priorité à la carte cible foo
quand les touches se chevauchent. Si vous voulez que ce soit l'inverse, vous devez appeler bar.merge(foo);
.
Cependant, il y a une différence entre l'utilisation insert()
y merge()
concernant ce qui arrive à la carte source. Le site insert()
ajoute de nouvelles entrées à la carte cible, tandis que la fonction merge()
déplace les entrées de la carte source. Cela signifie, pour l'exemple ci-dessus, que insert()
ne modifie pas bar
mais merge()
supprime 4:40
de bar
de sorte que seul 2:20
y 3:30
rester dans bar
.
Note : J'ai réutilisé l'exemple de jkerian qui utilise map<int, int>
pour des raisons de brièveté, mais merge()
fonctionne également pour votre map<string, string>
.
Code sur Coliru