C/C++中交换两个整型数值的方法

实现交换两个整数的方式有很多,下面将简单介绍一些目前我学习到的方法,欢迎大家补充指正。

//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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值