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 }

原文地址:https://www.cnblogs.com/didiaodidiao/p/9398361.html

时间: 2024-08-10 08:40:09

C++中的swap(交换函数)的相关文章

centos中设置swap交换空间的大小设置和swappiness的比例设置

首先使用free -m命令查看内存使用情况和swap的大小 关闭swap: 设置swap的大小: bs指的是Block Size,就是每一块的大小.这里的例子是1M,意思就是count的数字,是以1M为单位的. count是告诉程序,新的swapfile要多少个block.这里是1024,就是说,新的swap文件是5G大小. 注意:可能需要点时间完成此步,耐心等待完成. 把增大后的文件变为swap文件: 重新打开swap:  让swap在启动的时候,自动生效.打开/etc/fstab文件,加上以

(转)谈谈C++中的swap函数

转自:http://blog.csdn.net/ryfdizuo/article/details/6435847 1,最通用的模板交换函数模式:创建临时对象,调用对象的赋值操作符. [cpp] view plain copy print? template <class T> void swap ( T& a, T& b ) { T c(a); a=b; b=c; } 需要构建临时对象,一个拷贝构造,两次赋值操作. 2,针对int型优化: [cpp] view plain co

【转】 谈谈C++中的swap函数

1,最通用的模板交换函数模式:创建临时对象,调用对象的赋值操作符. 1 template <class T> void swap ( T& a, T& b ) 2 { 3 T c(a); a=b; b=c; 4 } 5 需要构建临时对象,一个拷贝构造,两次赋值操作. 2,针对int型优化: 1 void swap(int & __restrict a, int & __restrict b) 2 { 3 a ^= b; 4 b ^= a; 5 a ^= b; 6

C++中的swap函数

最通用的模板交换函数模式:创建临时对象,调用对象的赋值操作符 template <class T> void swap ( T& a, T& b ) { T c(a); a=b; b=c; } 需要构建临时对象,一个拷贝构造,两次赋值操作. 针对int型优化 void swap(int & __restrict a, int & __restrict b) { a ^= b; b ^= a; a ^= b; } 无需构造临时对象,异或.

用异或操作实现的交换函数用以实现数组逆置中须要注意的问题

用元素交换函数实现数组逆置非常easy,如以下代码:(数组左右元素交换) #include<iostream> #include<stdlib.h> using namespace std; void swap(int &a, int &b) { int tmp = a; a = b; b = tmp; } int main() { int a[5] = { 1, 2, 3, 4, 5 }; int lenth = sizeof(a) / sizeof(a[0]);

用异或操作实现的交换函数用以实现数组逆置中需要注意的问题

用元素交换函数实现数组逆置很简单,如下面代码:(数组左右元素交换) #include<iostream> #include<stdlib.h> using namespace std; void swap(int &a, int &b) { int tmp = a; a = b; b = tmp; } int main() { int a[5] = { 1, 2, 3, 4, 5 }; int lenth = sizeof(a) / sizeof(a[0]); in

C++中交换函数的几种写法与辨析

#include <iostream> using namespace std; //错误方法, //这里是把主函数的a, b进行复制然后交换 //函数执行完毕后释放复制的a, b, //而没有保存a,b交换后的值 void fun_one(int x, int y) { int temp; temp = y; y = x; x = temp; } //正确的方法之一 //使用指针的交换 void fun_two(int *x, int *y) { int c = 0; c = *x; *x

自定义交换函数

#include<stdio.h> #define N 20 void Swap(int *temp,int *cont) /*定义一个交换函数*/ { int var; var=*temp,*temp=*cont,*cont=var; return; } int main() { int a[N],i,j; for(i=0;i<N;i++) scanf("%d",&a[i]); for(i=1;i<N;i++){ for(j=0;j<N-i;j+

一个数据交换函数引发的思考

近日,在书中看到一个关于数据交换函数的源代码,发现挺有意思,具体代码如下: 1 void swap(int* a, int* b) 2 { 3 *a ^= *b ^= *a ^= *b; 4 } 根据 C 语言异或赋值操作符(^=)的计算规则和异或运算符(^)的运算法则,应按照从右到左的顺序进行计算,具体计算过程演示如下: 1 *a = *a ^ *b; 2 *b = *b ^ *a = *b ^ ( *a ^ *b ) = *a; //将式1代入 3 *a = *a ^ *b = ( *a ^

C++中string的成员函数

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86