そうだ、reverse関数を実装しよう

某社に面接に行ってきました。
で、そこで「reverse関数書いて(意訳)」と言われたので書いてきた

void reverse(std::string& str)
{
	size_t N = str.size();
	for (size_t i = 0; i < N/2; ++i)
		std::swap(str[i], str[N - 1 - i]);
}

こんなの。CodeIQなら★1レベルか

せっかくだから他の実装方も考えていこうか

1:Iteratorでまわしてpush_frontしていく方法
効率が悪い。ついでに言うとpush_frontがstringにない。operator+を使えばできそうだがそこまでしたくない

2:reverse Iteratorでpush_backしていく方法
もうこれでいいじゃん

std::string reverse(const std::string& str)
{
	return std::string(str.rbegin(),str.rend());
}

正しい。正しいがなんか身も蓋ももない方法

3:foldlでどーたらこ―たら
4:foldrでどーたらこ―たら

foldr([](std::string s,char c){return c+s; },str,std::string());
foldr([](char c, std::string s){return s+c; },str,std::string());

こんな感じか、foldは各自で実装してくれ

5:binary_foldで

binary_fold([](std::string l, std::string r){return r + l; }, str, [](char c){return std::string{ c }; });

これくらいか。他の実装思いついたら誰か教えてくれ