Ни один из ответов, предоставленных до сих пор, не касается несуществующих ключей и сохраняет несуществующие эти ключи.
template<class Key, class Value>
void swap_map_elements(std::map<Key, Value>& map, const Key& key1, const Key& key2)
{
auto it1 = map.find(key1);
auto it2 = map.find(key2);
auto end = map.end();
if(it1 != end && it2 != end) {
std::swap(it1->second, it2->second);
}
else if(it1 != end) {
map.emplace(std::make_pair(key2, std::move(it1->second)));
map.erase(key1);
}
else if(it2 != end) {
map.emplace(std::make_pair(key1, std::move(it2->second)));
map.erase(key2);
}
}
Пример:
auto M = std::map<int, std::string>();
M.emplace(std::make_pair(1, "one"));
M.emplace(std::make_pair(2, "two"));
swap_map_elements(M, 1, 2); // 1: "two", 2: "one"
swap_map_elements(M, 1, 4); // 2: "one", 4: "two"
swap_map_elements(M, 5, 2); // 4: "two", 5: "one"
swap_map_elements(M, 8, 9); // 4: "two", 5: "one"