函数模板
<algorithm>

std::swap_ranges

template <class ForwardIterator1, class ForwardIterator2>  ForwardIterator2 swap_ranges (ForwardIterator1 first1, ForwardIterator1 last1,                                ForwardIterator2 first2);
交换两个范围的值
将范围 [first1,last1) 中每个元素的值与范围 first2 开始的相应元素的值进行交换。

该函数调用 swap (未限定) 来交换元素。

此函数模板的行为等同于
1
2
3
4
5
6
7
8
9
10
template<class ForwardIterator1, class ForwardIterator2>
  ForwardIterator2 swap_ranges (ForwardIterator1 first1, ForwardIterator1 last1,
                                ForwardIterator2 first2)
{
  while (first1!=last1) {
    swap (*first1, *first2);
    ++first1; ++first2;
  }
  return first2;
}

参数

first1, last1
用于交换的序列之一的起始和结束位置的正向迭代器。所使用的范围是 [first1,last1),它包含 first1last1 之间的所有元素,包括 first1 指向的元素,但不包括 last1 指向的元素。
first2
用于交换的另一个序列的起始位置的正向迭代器。所使用的范围包含的元素数量与范围 [first1,last1) 相同。
两个范围不得重叠。

这两个范围不得重叠。
swap 应定义为对称地(双向)交换两个迭代器类型指向的对象。

返回值

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

示例

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

int main () {
  std::vector<int> foo (5,10);        // foo: 10 10 10 10 10
  std::vector<int> bar (5,33);        // bar: 33 33 33 33 33

  std::swap_ranges(foo.begin()+1, foo.end()-1, bar.begin());

  // print out results of swap:
  std::cout << "foo contains:";
  for (std::vector<int>::iterator it=foo.begin(); it!=foo.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  std::cout << "bar contains:";
  for (std::vector<int>::iterator it=bar.begin(); it!=bar.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  return 0;
}

输出
foo contains: 10 33 33 33 10
bar contains: 10 10 10 33 33


复杂度

线性的,与 firstlast 之间的距离成比例:对范围内的每个元素执行交换操作。

数据竞争

两个范围内的对象都会被修改。

异常

如果元素赋值或迭代器操作抛出异常,则会抛出异常。
请注意,无效参数会导致未定义行为

另见