for_each итерирует, но НЕ ВОЗВРАЩАЕТ результат, а применяет его «на месте».
std::transform же работает с итераторами (т.е. тоже ничего не возвращает).
Так что это не то.
Я понимаю, что в 2 строчки можно записать (вначале — определить массив-результат пустой, а затем — через for_each или transform его заполнить). Но некрасиво же, хочется, как в Perl — cout<<join(apply(hash, [](const pair<string,string>& e) { return e.first + "=>" + e.second; }), "\n");