Всем привет! Сегодня я столкнулся с ошибкой при использований map в C++.
Мой код который получил WA 1 имел строку: cost[x] = (cost.find(x) == cost.end() ? c : min(cost[x], c));
Я этот код переписал через if и получил AC: if(cost.find(x) == cost.end())cost[x] = c; else cost[x] = min(cost[x], c);
Может кто нибудь обьяснить почему так получился?
Интересно, что отправляя под GNU C++17, тот же код дает OK
cost[x]=
— если эта часть выражения выполняется раньше чем другая, то элемент добавляется в мапу и логика не верна. До c++17 порядок вычисления аргументов в таком выражении произволен, так что это UB.Вот ссылка на принятый proposal, кому интересно: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0145r3.pdf