another way:
#include <iostream>
#include <iterator>
#include <algorithm>
int main() {
std::string input;
std::getline(std::cin, input);
std::copy(input.rbegin(), input.rend(),
std::ostream_iterator<char>(std::cout));
std::cout << '\n';
return 0;
}
If I were going to do this often, I'd be tempted to make a little library extension:
#include <iostream>
#include <iterator>
#include <algorithm>
#include <string>
namespace notstd {
template<class Iter>
struct reverser
{
using value_type = typename std::iterator_traits<Iter>::value_type;
template<class Ch, class Traits>
std::basic_ostream<Ch, Traits>&
operator ()(std::basic_ostream<Ch, Traits>& os) const
{
std::copy(first, last,
std::ostream_iterator<value_type, Ch, Traits>(os));
return os;
}
Iter first, last;
template<class Ch, class Traits>
friend std::basic_ostream<Ch, Traits>&
operator <<(std::basic_ostream<Ch, Traits>& os, reverser eng)
{
return eng(os);
}
};
template<class Iter>
auto make_reverser(Iter first, Iter last)
{
return reverser<Iter> {first, last};
}
template<class Iter,
std::enable_if_t<std::is_same<std::remove_cv_t<typename std::iterator_traits<Iter>::value_type>, char>::value>* = nullptr
>
auto to_string(const reverser<Iter>& eng)
{
return std::string(eng.first, eng.last);
}
template<class Iter,
std::enable_if_t<std::is_same<std::remove_cv_t<typename std::iterator_traits<Iter>::value_type>, wchar_t>::value>* = nullptr
>
auto to_string(const reverser<Iter>& eng)
{
return std::wstring(eng.first, eng.last);
}
template<class Range>
auto reversed(Range&& range)
{
return make_reverser(std::rbegin(range), std::rend(range));
}
template<class Elem, std::size_t N,
std::enable_if_t<
std::is_same<char, std::remove_cv_t<Elem>>::value or
std::is_same<wchar_t, std::remove_cv_t<Elem>>::value
> * = nullptr
>
auto reversed(Elem (& range)[N])
{
static_assert(N > 0, "");
return make_reverser(std::rbegin(range) + 1,
std::rend(range));
}
}
int main(int argc, char **argv)
{
std::string input = argv[0];
// std::getline(std::cin, input);
std::cout << notstd::reversed(input) << '\n';
std::cout << notstd::reversed("Hello") << std::endl;
std::wcout << notstd::reversed(L"World") << std::endl;
std::cout << to_string(notstd::reversed("baloney")) << std::endl;
std::wcout << to_string(notstd::reversed(L"wide baloney")) << std::endl;
return 0;
}
example output:
don/gubed-dliub-ekamc/tcejorp/yalp/segdohr/sresU/
olleH
dlroW
yenolab
yenolab ediw