C++中的swap(交换函数)
交换两个变量的值很简单。
比如 int a = 1; b = 2; 交换a b的值
这个很简单 很容易想到的是找个中间变量比如 int temp = a; a = b; b = temp;
不需要中间变量可不可以?
当然是可以的。
比如
【加减法】
a = a + b; b = a - b; a = a - b;
该方法可以交换整型和浮点型数值的变量,但在处理浮点型的时候有可能出现精度的损失,例如对数据:
a = 3.123456
b = 1234567.000000
交换后各变量值变为:
a = 1234567.000000
b = 3.125000
很明显,原来a的值在交换给b的过程中发生了精度损失。
【乘除法】
a = a * b; b = a / b; a = a / b;
乘除法更像是加减法向乘除运算的映射,它与加减法类似:可以处理整型和浮点型变量,但在处理浮点型变量时也存
在精度损失问题。而且乘除法比加减法要多一条约束:b必不为0。
可能经验上的某种直觉告诉我们:加减法和乘除法可能会溢出,而且乘除的溢出会特别严重。其实不然,采用这两种
方法都不会溢出。以加减法为例,第一步的加运算可能会造成溢出,但它所造成的溢出会在后边的减运算中被溢出回来。
【异或法】
a ^= b; //a=a^b
b ^= a; //b=b^(a^b)=b^a^b=b^b^a=0^a=a
a ^= b; //a=(a^b)^a=a^b^a=a^a^b=0^b=b
异或法可以完成对整型变量的交换,对于浮点型变量它无法完成交换。
第二类方法更像是玩了一个文字游戏,此种方法采用了在代码中嵌入汇编代码的方法避免了临时变量的引入,但究其
本质还是会使用额外的存储空间。此种方法可以有很多种,下边列出几种:
等等..............
但是对结构体这种交换就不太实用了应为结构体需要对每个数据都进行交换,这个时候用函数就是最简单的了。
C++提供了一个swap函数用于交换,用法如下。
swap 包含在命名空间std 里面
1 #include<iostream>
2 #include<string>
3 #include<algorithm>//sort函数包含的头文件
4 using namespace std;
5 //定义一个学生类型的结构体
6 typedef struct student
7 {
8 string name; //学生姓名
9 int achievement; //学生成绩
10 } student;
11
12
13
14
15 //用来显示学生信息的函数
16 void show(student *stu,int n)
17 {
18 for(int i = 0; i < n; i++)
19 {
20 cout<<"姓名:"<<stu[i].name<<'\t'<<"成绩:"<<stu[i].achievement<<endl;
21 }
22 }
23
24 int main()
25 {
26 student stu[] = { {"张三",99},{"李四",87},{"王二",100} ,{"麻子",60}};
27 cout<<"交换前:"<<endl;
28 show(stu,4);
29 swap(stu[0],stu[3]);
30 cout<<"交换后:"<<endl;
31 show(stu,4);
32 return 0;
33 }
用函数不用担心精度的损失
1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 float a = 3.123456,b = 1234567.000000; 6 swap(a,b); 7 cout<<fixed; 8 cout<<a<<"->"<<b<<endl; 9 return 0; 10 }
1 #include<iostream> 2 #include<string> 3 using namespace std; 4 int main() 5 { 6 string a ="666",b = "999"; 7 swap(a,b); 8 cout<<a<<"->"<<b<<endl; 9 return 0; 10 }