#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(*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+CnZvaWQgbXlfbWVyZ2Uoc3RkOjptYXA8SywgVj4mIG0xLCBjb25zdCBzdGQ6Om1hcDxLLCBWPiBtMikKewogICAgYXV0byBpdDEgPSBtMS5iZWdpbigpOwogICAgYXV0byBpdDIgPSBtMi5iZWdpbigpOwogICAgCiAgICB3aGlsZSAoaXQxICE9IG0xLmVuZCgpICYmIGl0MiAhPSBtMi5lbmQoKSkgewogICAgICAgIGlmICgqaXQxIDwgKml0MikgewogICAgICAgICAgICBpdDEgPSBtMS5lcmFzZShpdDEpOwogICAgICAgIH0gZWxzZSBpZiAoKml0MiA8ICppdDEpIHsKICAgICAgICAgICAgbTEuaW5zZXJ0KCppdDIpOwogICAgICAgICAgICArK2l0MjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICArK2l0MTsKICAgICAgICAgICAgKytpdDI7CiAgICAgICAgfQogICAgfQogICAgbTEuZXJhc2UoaXQxLCBtMS5lbmQoKSk7CiAgICBtMS5pbnNlcnQoaXQyLCBtMi5lbmQoKSk7Cn0KCmludCBtYWluKCkgewogICAgc3RkOjptYXA8aW50LCBzdGQ6OnN0cmluZz4gbTEge3sxLCAiT25lIn0sIHsyLCAiVHdvIn0sIHszLCAiVGhyZWUifX07CiAgICBjb25zdCBzdGQ6Om1hcDxpbnQsIHN0ZDo6c3RyaW5nPiBtMiB7ezEsICJPbmVCIn0sIHsyLCAiVHdvQiJ9LCB7NCwgIkZvdXIifX07CiAgICAKICAgIG15X21lcmdlKG0xLCBtMik7CiAgICBmb3IgKGNvbnN0IGF1dG8mIHAgOiBtMSkgewogICAgICAgIHN0ZDo6Y291dCA8PCBwLmZpcnN0IDw8ICI6IiA8PCBwLnNlY29uZCA8PCBzdGQ6OmVuZGw7CiAgICB9Cn0K