实现交换两个整数的方式有很多,下面将简单介绍一些目前我学习到的方法,欢迎大家补充指正。
//C语言中学到的最简单直接的方式
void swap(int* a,int* b)
{
int temp = *a;
*a = *b;
*b = temp;
}
//由于C++中存在引用机制,可以直接修改传入参数的值
void swap(int& a,int& b)
{
int temp = a;
a = b;
b= temp;
}
同时也可以不使用临时变量来交换两个整数,一般常见的方法有两种:加法与异或运算。
//当x,y同号可能会超过整数的表示范围而溢出
void swap1(int& x,int& y)
{
x = x + y;
y = x - y;
x = x - y;
}
//当x,y异号时可能会溢出
void swap2(int& x,int& y)
{
x = x - y;
y = x + y;
x = y - x;
}
/*
*C/C++语言中执行异或操作时会十进制数值转换二进制,然后按位异或。
*其中这里简单的介绍一下异或规则,即是:相同为0,不同为1。
*对下面的步骤进行简单地解释,一个数异或它自己即为0,而任何数异或0即它本身。
*/
void swap3(int& x,int& y)
{
if(x == y)//虽然不加if判断结果也是正确的,但可以省去执行操作的时间
return ;
x ^= y;//x = x ^ y;
y ^= x;//y = y ^ x;
x ^= y;//x = x ^ y;
}
上面两种使用加法描述的过程可能会导致溢出,同时不适用与swap(a,a)即两个参数相同的情况,因此可以对加法过程做一些改进:
void swap(int& x,int& y)
{
if(x == y)
return ;
//注意0这个临界值
if(x>=0 && y>=0 || x<=0 && y<=0){
x = x - y;
y = x + y;
x = y - x;
}
else{
x = x + y;
y = x - y;
x = x - y;
}
}
STL中swap函数原型的定义
template <class T>
void swap(T& a,T& b)
{
T temp = a;
a = b;
b = temp;
}
同时对于大多数容器也大体实现了各自的swap成员函数,然而这两者是不同的概念。对自定义类型使用STL algorithm中的swap函数,会调用自定义的类型的拷贝构造函数一次,赋值函数两次;自定义类型中没有定义那么就会使用默认的拷贝构造函数和赋值函数。 如果是容器,那么会遍历然后进行赋值。如果需要对自定义类型进行操作,自定义类型中涉及指针成员时,要注意深度拷贝的情况。
http://www.cnblogs.com/xkfz007/archive/2012/05/16/2505376.html