本文参考《程序员面试宝典》,如有错误,请指明!谢谢!


交换两个变量的值的函数,我们通常命名为swap。


1、最常用的方法是用借用临时变量,如下:


void swap(T *a, T *b)

{

   T temp = *a;

   *a = *b;

   *b = *a;

}


这种方法中,T的类型可以是很多种,基本上只要支持上面的赋值操作或复制构造函数,那么这个函数就算是正常了。而且这种方法的可阅读性比较好。


2、利用运算与逆运算的方法,可以不使用额外的空间。


如果存在运算 # 和 @,使得

c = a # b,

a == c @ b,

b == c @ a

则理论上可实现交换a, b的值。但在计算机中,这种方法往往存在一定的局限性。如下面两种实现:


void swap(T *a, T *b)

{

   *a = *a + *b;

   *b = *a - *b;

   *a = *a - *b;

}


void swap(T *a, T *b)

{

   *a = *a ^ *b;

   *b = *a ^ *b;

   *a = *a ^ *b;

}


这两种方法都存在一个共同的问题:T的类型受到较大的制约。如果T是类,则可能不支持,但可以通过运算符载来解决。

对于前者,还存在另一个问题,就是溢出,包括上溢和下溢。如对于 T 为bool类型,当 *a *b 都为 true时就出错。如对于 T 为 float类型,如果 *a 是一个很大的数,而 *b 是一个很小的数,那么相加后就可能丢失精度。

对于后者,就无溢出问题,但却连基本的float,double类型都不支持。