关于swap函数的几点见解

如果让你写一个swap函数,你会怎么写呢?


正常人应该都是这么写的

void swap(int &a,int &b)
{
	int temp;
	temp=a;
	a=b;
	b=temp;
}
但如果不能使用中间变量来进行交换呢?

有以下两种方法

void swap(int &a,int &b)
{
	a=a+b;
	b=a-b;
	a=a-b;
}
void swap(int &a,int &b)
{
	a^=b;
	b^=a;
	a^=b;
}
第一种应该都好理解,第二种则是利用了逻辑运算中的异或运算来交换两个整形变量的值。

具体分析一下第二种的异或运算法。

若a=0,b=1

a^=b之后,a=1,b=1

b^=a之后,a=1,a=0

a^=b之后,a=1,b=0

即完成交换。

另外三种情况(a=1,b=0和a=0,b=0和a=1,b=1)也同样可以验证。

但是这两种方法都有很明显的缺陷。第一种比较容易溢出,而第二种则无法应用到浮点型数据的交换上去。


为了尝试能找到一种比较万能的swap函数,去参考了下memcpy函数,那么,可以模仿着来写

void swap(void *a,void *b,size_t size)
{
	unsigned char *p1=(unsigned char *)a;
	unsigned char *p2=(unsigned char *)b;
	while(size--)
	{
		*p1^=*p2;
		*p2^=*p1;
		*p1^=*p2;
		p1++;
		p2++;
	}
}

这样的一个函数还是存在着空间复杂度较大的问题,但是它能比较好地解决数据类型的问题,基本上所有的数据类型都能通过这个函数来进行交换。它的本质就是将数据分割成几个字节分别进行交换。但是它也同样无法交换不同类型的数据。


要找到一个更好的swap函数、万能的swap函数,还需要很大的努力!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值