5. 交换函数

1. 库函数,包含在头文件 <utility> 中。

#include <utility>
using std::swap;
swap(a, b);
 1// swap algorithm example (C++11)
 2#include <iostream>     // std::cout
 3#include <utility>      // std::swap
 4
 5int main ()
 6{
 7    int x = 10, y = 20;                  // x:10 y:20
 8    std::swap(x, y);                  // x:20 y:10
 9
10    int foo[4];                      // foo: ?  ?  ?  ?
11    int bar[] = {10, 20, 30, 40};       // foo: ?  ?  ?  ?    bar: 10 20 30 40
12    std::swap(foo, bar);              // foo: 10 20 30 40   bar: ?  ?  ?  ?
13
14    std::cout << "foo contains:";
15    for (int i: foo) std::cout << ' ' << i;
16    std::cout << '\n';
17
18    return 0;
19}

2. 指针。

1templtate<class T>
2void Swap(T *x, T *y)
3{
4    T tmp = *x;
5    *x = *y;
6    *y = tmp;
7}

3. 引用。

1templtate<class T>
2void Swap(T &x, T &y)
3{
4    T tmp = x;
5    x = y;
6    y = tmp;
7}

4. 异或。适用于整型/字符/枚举类型,浮点型不适用。 SWAP(a, a)Swap(a, a) 会导致 a=0a=''

1#define SWAP(a, b) a^=b^=a^=b;
2
3template<class T>
4void Swap(T& a, T& b)
5{
6    a = a ^ b;
7    b = a ^ b;
8    a = a ^ b;
9}

4. 赋值。受编译器影响,先执行 a+b 还是先执行 b=a

#define SWAP(a, b) a=a+b-(b=a);

5. 加减。无需申请额外空间。

1templtate<class T>
2void Swap(T &x, T &y)
3{
4    x = x + y;
5    y = x - y;
6    x = x - y;
7}

Note

如果存在类型特定的 swap 版本(即为某个类定制的swap),其匹配程度会优于 std 中定义的版本。

using std::swap; // 声明

void swap(Foo& a, Foo&b); // 声明

Foo a, b;

swap(a, b); // 此处匹配的是定制版本的 swap

5.1. 参考资料

  1. C++ reference