C++中交换两个元素值

文章目录

首先,交换变量值的函数传值肯定不行,要么传引用,要么传指针,以传引用为例

使用临时变量

      
      
1
2
3
4
5
6
      
      
void swap(int &a, int & b)
{
int t = a
a = b;
b = t
}

不使用临时变量

位运算

      
      
1
2
3
4
5
6
      
      
void swap(int &a, int &b)
{
a = a ^ b;
b = a ^ b;
a = a ^ b;
}

可以这么理解

      
      
1
2
3
      
      
new a = olda ^ oldb
new b = new a ^ oldb = olda ^ oldb ^ oldb = olda
new a = new a ^ new b = olda ^ oldb ^ olda = oldb

如此完成交换。

但是该位运算存在一个问题,对于数组的交换要注意。

有一次写快速排 大专栏  C++中交换两个元素值序的时候使用了位运算的swap,结果数组里出现了好多0。分析之后原因如下

比如数组为a = {3, 1, 2},然后调用了swap(a[1], a[1]),那这样会导致什么呢

      
      
1
      
      
a[ 1] = a[ 1] ^ a[ 1] = 0

即a[1]会被置为0。

当然,调用者本就应该来判断待交换的索引是否相同,如果相同就不交换了。但函数本身最好也要加上不等性判断

      
      
1
2
      
      
if(a == b)
return;

算术运算

      
      
1
2
3
4
5
6
      
      
void swap(int &a, int & b)
{
a = a + b;
b = a - b;
a = a - b;
}

可以这么理解

      
      
1
2
3
      
      
new a = olda + oldb
new b = new a - oldb = olda + oldb - oldb = olda
new a = new a - new b = olda + oldb - olda = oldb

同样存在上面的问题

猜你喜欢

转载自www.cnblogs.com/liuzhongrong/p/12289518.html