STL 源碼剖析 演算法 stl_algo.h -- rotate

來源:互聯網
上載者:User

標籤: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



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.