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)内的对象将被修改。

异常

如果任何元素交换(或移动)操作抛出异常,或者任何迭代器操作抛出异常,则抛出异常。
请注意,无效参数会导致未定义行为

另见