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=0
或 a=''
。
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. 参考资料
C++ reference