function template
<algorithm>

std::rotate

template <class ForwardIterator>  void rotate (ForwardIterator first, ForwardIterator middle,               ForwardIterator last);
template <class ForwardIterator>  ForwardIterator rotate (ForwardIterator first, ForwardIterator middle,                          ForwardIterator last);
左旋範圍內的元素
旋轉範圍 [first,last) 中元素的順序,使得 middle 指向的元素成為新的第一個元素。

此函式模板(C++98)的行為等同於
1
2
3
4
5
6
7
8
9
10
11
12
template <class ForwardIterator>
  void rotate (ForwardIterator first, ForwardIterator middle,
               ForwardIterator last)
{
  ForwardIterator next = middle;
  while (first!=next)
  {
    swap (*first++,*next++);
    if (next==last) next=middle;
    else if (first==middle) middle=next;
  }
}

引數

first, last
Forward iterators 指向要左旋的序列的初始位置和結束位置。使用的範圍是 [first,last),它包含 firstlast 之間的所有元素,包括 first 指向的元素,但不包括 last 指向的元素。
請注意,在此函式中,這些不是連續的引數,而是第一個和第三個
middle
Forward iterator 指向範圍 [first,last) 中將移動到範圍第一個位置的元素。

ForwardIterator 應指向一個定義了 swap 且是可移動構造可移動賦值的型別。

返回值


指向現在包含 first 原先指向的值的元素的迭代器。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// rotate algorithm example
#include <iostream>     // std::cout
#include <algorithm>    // std::rotate
#include <vector>       // std::vector

int main () {
  std::vector<int> myvector;

  // set some values:
  for (int i=1; i<10; ++i) myvector.push_back(i); // 1 2 3 4 5 6 7 8 9

  std::rotate(myvector.begin(),myvector.begin()+3,myvector.end());
                                                  // 4 5 6 7 8 9 1 2 3
  // print out content:
  std::cout << "myvector contains:";
  for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  return 0;
}

輸出
myvector contains: 4 5 6 7 8 9 1 2 3


複雜度

最多線性於 firstlast 之間的距離:透過交換(或移動)元素直到所有元素都被重新定位。

資料競爭

範圍[first,last)內的物件將被修改。

異常

如果任何元素交換(或移動)操作丟擲異常,或者任何迭代器操作丟擲異常,則丟擲異常。
請注意,無效引數會導致未定義行為

另見