• // <algorithm> 
    template <class ForwardIterator>
        void rotate (
            ForwardIterator first,
            ForwardIterator middle,
            ForwardIterator last);
    
  • // <algorithm> 
    template <class ForwardIterator>
        ForwardIterator rotate (
            ForwardIterator first,
            ForwardIterator middle,
    ​        ForwardIterator last);
    

循环移动指定范围中的元素。

该函数等价于:

template<class _FwdIt> inline
    void _Rotate(_FwdIt _First, _FwdIt _Mid, _FwdIt _Last,
        forward_iterator_tag)
    {    // rotate [_First, _Last), forward iterators
    for (_FwdIt _Next = _Mid; ; )
        {    // swap [_First, ...) into place
        _STD iter_swap(_First, _Next);
        if (++_First == _Mid)
            if (++_Next == _Last)
                break;    // done, quit
            else
                _Mid = _Next;    // mark end of next interval
        else if (++_Next == _Last)
            _Next = _Mid;    // wrap to last end
        }
    }
  • firstlast

    分别指向序列中初始及末尾位置的正向迭代器(Forward Iterators)。这个范围即 [first,last) ,包括 first 到 last 间的所有元素,包括 first 指向的元素,但不包括 last 指向的元素。

    middle

    指向范围 [first,last) 中某个元素的正向迭代器。

  • C++98

    无。

    C++11

    返回一个迭代器,该迭代所指向的元素中的值等于操作进行前 first 所指向的元素中的值。

  • 例 1

    #include <iostream>
    #include <algorithm>
    #include <iterator>
    #include <vector>
    
    #define CLASSFOO_VECTOR(type, name, ...) \
    static const type name##_a[] = __VA_ARGS__; \
    std::vector<type> name(name##_a, name##_a + sizeof(name##_a) / sizeof(*name##_a))
    
    namespace ClassFoo{
        void Rotate_1() {
            CLASSFOO_VECTOR(int, BigVector1, { 8, 23, 5, 7, 29, 0, 7, 7, 7, 1, 1 });
            // 等价比较
            std::rotate(
                std::begin(BigVector1),
                std::begin(BigVector1) + 3,
                std::end(BigVector1));
            // 输出反转结果
            std::copy(
                BigVector1.begin(),
                BigVector1.end(),
                std::ostream_iterator<int>(std::cout, " "));
            std::cout << std::endl;
        }
    }
    int main()
    {
        ClassFoo::Rotate_1();
        return 0;
    }

    7 29 0 7 7 7 1 1 8 23 5

  • 复杂度

    O(n)n 为 last first.

    数据争用相关

    范围 [first,last) 中的所有元素都被修改过。

    异常安全性相关

    如果元素交换(Swap)、元素移动(Move)、操作某个迭代器抛异常,该函数才会抛异常。

    注意 无效参数将导致未定义行为(Undefined behavior)