旋轉元素次序:rotate
源碼:
template<class _RanIt,
class _Diff,
class _Ty> inline
void _Rotate(_RanIt _First, _RanIt _Mid, _RanIt _Last, _Diff *, _Ty *)
{ // rotate [_First, _Last), random-access iterators
_Diff _Shift = _Mid - _First;
_Diff _Count = _Last - _First;
for (_Diff _Factor = _Shift; _Factor != 0; )//求最大公因子
{ // find subcycle count as GCD of shift count and length
_Diff _Tmp = _Count % _Factor;
_Count = _Factor;
_Factor = _Tmp;
}
if (_Count < _Last - _First)
for (; 0 < _Count; --_Count)
{ // rotate each subcycle
_RanIt _Hole = _First + _Count;
_RanIt _Next = _Hole;
_RanIt _Next1 = _Next + _Shift == _Last ? _First : _Next + _Shift;
for (; ; )
{ // percolate elements back around subcycle
iter_swap(_Next, _Next1);
_Next = _Next1;
_Next1 = _Shift < _Last - _Next1 ? _Next1 + _Shift
: _First + (_Shift - (_Last - _Next1));
if (_Next1 == _Hole)
break;
}
}
}
int main()
{
vector<int> vecInt;
for( int i = 0;i < 10;++ i )
{
vecInt.push_back( i * 10 );
}
rotate( vecInt.begin(),vecInt.begin() + 7,vecInt.end() );
copy( vecInt.begin(),vecInt.end(),ostream_iterator<int>( cout," " ) );
system( "pause" );
return 0;
}
這段代碼确實難懂,看了幾遍沒有看懂.
想去借助源碼剖析,結果聽失望的,侯捷對于forward和bidirectional iterator兩個版本有細緻的講解,唯獨random access iterator沒有.
前面兩個算法易懂,關鍵是後一個算法.__rotate_cycle在幹嘛呢?這樣做有的原理是啥呢?還是不清楚.感覺侯捷可能自己也沒法講解,"故意"跳過.
關于這個函數的講解可能就暫時過了.去Google一下,發現在部落格園裡面有一篇文章對後面的那個函數解釋的比較詳細.但是它說到數論,這個沒有學過.很可惜.
暫時先過吧.