#include <iostream>
#include <map>
#include <string>
template <typename K, typename V>
void my_merge(std::map<K, V>& m1, const std::map<K, V> m2)
{
auto it1 = m1.begin();
auto it2 = m2.begin();
while (it1 != m1.end() && it2 != m2.end()) {
if (*it1 < *it2) {
it1 = m1.erase(it1);
} else if (*it2 < *it1) {
m1.insert(it1, *it2);
++it2;
} else {
++it1;
++it2;
}
}
m1.erase(it1, m1.end());
m1.insert(it2, m2.end());
}
int main() {
std::map<int, std::string> m1 {{1, "One"}, {2, "Two"}, {3, "Three"}};
const std::map<int, std::string> m2 {{1, "OneB"}, {2, "TwoB"}, {4, "Four"}};
my_merge(m1, m2);
for (const auto& p : m1) {
std::cout << p.first << ":" << p.second << std::endl;
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8c3RyaW5nPgoKdGVtcGxhdGUgPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+CnZvaWQgbXlfbWVyZ2Uoc3RkOjptYXA8SywgVj4mIG0xLCBjb25zdCBzdGQ6Om1hcDxLLCBWPiBtMikKewogICAgYXV0byBpdDEgPSBtMS5iZWdpbigpOwogICAgYXV0byBpdDIgPSBtMi5iZWdpbigpOwogICAgCiAgICB3aGlsZSAoaXQxICE9IG0xLmVuZCgpICYmIGl0MiAhPSBtMi5lbmQoKSkgewogICAgICAgIGlmICgqaXQxIDwgKml0MikgewogICAgICAgICAgICBpdDEgPSBtMS5lcmFzZShpdDEpOwogICAgICAgIH0gZWxzZSBpZiAoKml0MiA8ICppdDEpIHsKICAgICAgICAgICAgbTEuaW5zZXJ0KGl0MSwgKml0Mik7CiAgICAgICAgICAgICsraXQyOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICsraXQxOwogICAgICAgICAgICArK2l0MjsKICAgICAgICB9CiAgICB9CiAgICBtMS5lcmFzZShpdDEsIG0xLmVuZCgpKTsKICAgIG0xLmluc2VydChpdDIsIG0yLmVuZCgpKTsKfQoKaW50IG1haW4oKSB7CiAgICBzdGQ6Om1hcDxpbnQsIHN0ZDo6c3RyaW5nPiBtMSB7ezEsICJPbmUifSwgezIsICJUd28ifSwgezMsICJUaHJlZSJ9fTsKICAgIGNvbnN0IHN0ZDo6bWFwPGludCwgc3RkOjpzdHJpbmc+IG0yIHt7MSwgIk9uZUIifSwgezIsICJUd29CIn0sIHs0LCAiRm91ciJ9fTsKICAgIAogICAgbXlfbWVyZ2UobTEsIG0yKTsKICAgIGZvciAoY29uc3QgYXV0byYgcCA6IG0xKSB7CiAgICAgICAgc3RkOjpjb3V0IDw8IHAuZmlyc3QgPDwgIjoiIDw8IHAuc2Vjb25kIDw8IHN0ZDo6ZW5kbDsKICAgIH0KfQo=