Life coding |
Takanori Ishikawa / Tokyo, Japan |
ちなみに Visual C++ 2010 付属の STL の実装はもっと豪快で
template<typename BidIt>
void b_rotate( BidIt s, BidIt m, BidIt e )
{
// s[1234]m[ABCDEF]e
std::reverse( s, m );
std::reverse( m, e );
// s[4321]m[FEDCBA]e
std::reverse( s, e );
// [ABCDEF1234]
}
これも (m-s)/2 + (e-m)/2 + (e-s)/2 = e-s 回。 これは目から鱗が落ちました。左右から迫りながら iter_swap って、 言われてみれば確かに reverse 操作なので、全部 reverse でいいじゃない、と。美しい。
"