標籤:style blog http color io for
本文為senlie原創,轉載請保留此地址:http://blog.csdn.net/zhengsenlie
rotate
--------------------------------------------------------------
描述:將[first, middle) 內的元素和[middle, last) 內的元素互換。
圖6-6g
/*------------------------------------------------------------*指派函數(dispatch function)*/template <class ForwardIterator>inline void rotate(ForwardIterator first, ForwardIterator middle, ForwardIterator last){if(first == middle || middle == last) return ;__rotate(first, middle, last, distance_type(first), iterator_category(first));}
下面根據不同的迭代器類型完成三個旋轉操作
rotate 的 forward iterator 版
思路:
1.以短段為依據,對應元素逐一對調
2.調整,對新的前、後段再作交換
3.當兩段都結束時,迴圈結束
圖6-6h
複雜度:O(n)
template<class ForwardIterator, class Distance>void __rotate(ForwardIterator first, ForwardIterator middle, ForwardIterator last, Distance*, forward_iterator_tag){for(ForwardIterator i = middle ; ; ){iter_swap(first, i); //前段,後段的元素一一交換++first; ++i; // 雙雙前進 1// 以下判斷是前段[first, middle)先結束還是後段 [middle, last) 後結束if(first == middle){ //前段結束了if(i == last) return; //如果後段同時也結束,整個就結束了middle = i;}else if(i == last){ //後段先結束i = middle; // 調整,準備對新的的前、後段再作交換}}}
rotate 的 bidirectional iterator 版
思路:
1.對前段逆轉
2.對後段逆轉
3.對整體逆轉
複雜度:O(n)
圖6-6i
template<class BidirectionalIterator, class Distance>void __rotate(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last, Distance *,bidirectional_iterator_tag){reverse(first, middle);reverse(middle,last);reverse(first, last);}
rotate 的 random access iterator 版 --> ?? 看不太懂。。。
template<class RandomAccessIterator, class Distance>void __rotate(RandomAccessIterator first, RandomAccessIterator middle,RandomAccessIterator last, Distance *,random_access_iterator_tag){//取全長和前段長度的最大公因子Distance n = __gcd(last - first, middle - first);while(n--){__rotate_cycle(first, last, first + n, middle - first, value_type(first));}}template <class EuclideanRingElement>EuclideanRingElement __gcd(EuclideanRingElement m, EuclideanRingElement n){ while (n != 0) { EuclideanRingElement t = m % n; m = n; n = t; } return m;}template <class RandomAccessIterator, class Distance, class T>void __rotate_cycle(RandomAccessIterator first, RandomAccessIterator last, RandomAccessIterator initial, Distance shift, T*) { T value = *initial; RandomAccessIterator ptr1 = initial; RandomAccessIterator ptr2 = ptr1 + shift; while (ptr2 != initial) { *ptr1 = *ptr2; ptr1 = ptr2; if (last - ptr2 > shift) ptr2 += shift; else ptr2 = first + (shift - (last - ptr2)); } *ptr1 = value;}
樣本:
char alpha[] = "abcdefghijklmnopqrstuvwxyz";rotate(alpha, alpha + 13, alpha + 26);printf("%s\n", alpha);// The output is nopqrstuvwxyzabcdefghijklm