本文参考《程序员面试宝典》,如有错误,请指明!谢谢!
交换两个变量的值的函数,我们通常命名为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类型都不支持。
本文出自 “chhquan” 博客,请务必保留此出处http://chhquan.blog.51cto.com/1346841/1357885
原文:http://chhquan.blog.51cto.com/1346841/1357885