auto
использует те же правила для вывода типов, что и шаблоны, и они предпочитают типы значений, а не ссылочные типы.Итак:
for (auto x : m)
эквивалентно:
for (std::map<int,int>::value_type x : m)
, и это создает копию ключа и значения.Затем вы изменяете копию, и ничто в реальной карте не изменяется.Вам нужно:
for (auto& x : m)
(или, если вы действительно мазохист):
for (std::map<int,int>::value_type& x : m)