引言
STL中 rotate(first, middle, last) 函数的作用是原地把容器区间 [first, middle)(左半部分) 与 [middle, last) (右半部分)的元素互换。
它的实现充分利用了不同迭代器的特性进行算法优化,从而达到最优的性能。以下是libc++(该库用于clang的C++编译器中)中该函数的实现,为了可读性修改了部分变量名以及删除了类型检查:
代码全文
template <class _ForwardIterator>
_ForwardIterator
rotate_left(_ForwardIterator first, _ForwardIterator last)
{
typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
value_type tmp = move(*first);
_ForwardIterator lm1 = move(next(first), last, first);
*lm1 = move(tmp);
return lm1;
}
template <class _BidirectionalIterator>
_BidirectionalIterator
rotate_right(_BidirectionalIterator first, _BidirectionalIterator last)
{
typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
_BidirectionalIterator lm1 = prev(last);
value_type tmp = move(*lm1);
_BidirectionalIterator fp1 = move_backward(first, lm1, last);
*first = move(tmp);
return fp1;
}
template <class _ForwardIterator>
_ForwardIterator
rotate_forward(_ForwardIterator first, _ForwardIterator middle, _ForwardIterator last)
{
_ForwardIterator i = middle;
while (true)
{
swap(*first, *i);
++first;
if (++i == last)
break;
if (first == middle)
middle = i;
}
_ForwardIterator r = first;
if (first != middle)
{
i = middle;
while (true)
{
swap(*first, *i);
++first;
if (++i == last)
{
if (first == middle)
break;
i = middle;
}
else if (first == middle)
middle = i;
}
}
return r;
}
template<typename _Integral>
_Integral
algo_gcd(_Integral x, _Integral y)
{
do
{
_Integral t = x % y;
x = y;
y = t;
} while (y);
return x;
}
template<typename _RandomAccessIterator>
_RandomAccessIterator
rotate_gcd(_RandomAccessIterator first, _RandomAccessIterator middle, _RandomAccessIterator last)
{
typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
const difference_type m1 = middle - first;
const difference_type m2 =