// <algorithm> 
template <class ForwardIterator1,
    class ForwardIterator2>
    ForwardIterator2 swap_ranges (
        ForwardIterator1 first1,
        ForwardIterator1 last1,
        ​ForwardIterator2 first2);

交换两个范围的元素。

该函数等价于:

template<class _FwdIt1,
    class _FwdIt2> inline
    _FwdIt2 _Swap_ranges(_FwdIt1 _First1, _FwdIt1 _Last1,
        _FwdIt2 _Dest)
    {    // swap [_First1, _Last1) with [_Dest, ...)
        for (; _First1 != _Last1; ++_First1, ++_Dest)
            _STD iter_swap(_First1, _Dest);
        return (_Dest);
    }
  • first1last1

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

    first2

    指向一个被交换(Swapped)序列中初始位置的正向迭代器。当前函数最多访问该序列中与范围 [first1,last1)  中相同元素个数的元素。

    注意 两个序列不能互相覆盖。

    返回

    一个迭代器,该迭代器指向第二个序列中最后一个被交换的元素。


  • 例 1

    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <iterator> 
    
    #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 SwapRanges_1() {
            CLASSFOO_VECTOR(int, BigVector, { 8, 23, 5, 6, 7, 29, 0, 5, 6, 7, 1, 1 });
            CLASSFOO_VECTOR(int, SmallVector, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
            // 将 BigVector 拷至 SmallVector
            std::swap_ranges(
                std::begin(BigVector),
                std::end(BigVector),
                std::begin(SmallVector));
            // 将 BigVector 拷至标准输出流中
            std::copy(
                BigVector.begin(),
                BigVector.end(),
                std::ostream_iterator<int>(std::cout, " "));
            std::cout << std::endl;
            // 将 SmallVector 拷至标准输出流中
            std::copy(
                SmallVector.begin(),
                SmallVector.end(),
                std::ostream_iterator<int>(std::cout, " "));
            std::cout << std::endl;
        }
    }
    int main()
    {
        ClassFoo::SwapRanges_1();
        return 0;
    }

    1 1 1 1 1 1 1 1 1 1 1 1 
    8 23 5 6 7 29 0 5 6 7 1 1 

  • 复杂度

    O(n)n 为 last first,对两个范围中的所有对应元素都进行一次交换操作。

    数据争用相关

    两个范围中的元素都被修改过。

    异常安全性相关

    如果元素赋值操作或操作某个迭代器抛异常,该函数才会抛异常。

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