最近发现大量博客上面关于交换函数的实现,基本上都给出了两种方式,一种是C++函数库已经实现的。另一种用异或实现。
1,最通用的模板交换函数模式:创建临时对象,调用对象的赋值操作符。
void swap(int &a, int &b)
{
int temp ;
temp =a;
a = b;
b = temp;
}
需要构建临时对象,一个拷贝构造,两次赋值操作。
2,针对int型优化:
void swap(int &a, int &b)
{
a ^= b;
b ^= a;
a ^= b;
}
无需构造临时对象,异或。
实际实验发现第二种方式存在漏洞,实验如下:
#include
#include
using namespace std;
void swap(int & a, int & b)
{
a ^= b;
b ^= a;
a ^= b;
}
int main()
{
int a[2] = {2,2};
cout<
<<"\t"<
<
从结果可以看出
当两个参数为同一个引用的时候,结果会直接改为零。所以该种实现方式应慎用。