C++中swap函数

本文是我用到swap函数时,对其产生好奇,所以结合网上有关博文写下的。个人水平有限,若有错误的地方,欢迎留言指出。谢谢!

一、通用的函数交换模板

1 template<class T>
2 void swap(T &a,T &b)
3 {
4     T c(a);
5     a=b;
6     b=c;
7 }

T为类型,可根据实际需要使用相应的类型

二、针对int类型的优化

使用异或,整数异或本身为结果0;一个数异或0结果为本身;

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

三、自定义swap时,注意事项

1、达不到交换的作用

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

这里只是交换了a和b实参的副本,而它们本身没有交换。

2、能达到交换的作用

 1 void swap(int *a,int *b)
 2 {
 3     int temp;
 4     temp=*a;
 5     *a=*b;
 6     *b=temp;
 7 }
 8
 9 //使用
10 int main()
11 {
12     int a=1,b=2;
13     swap(&a,&b);
14     return 0;
15 }

注意,第三行中,不要将temp定义为一个指针,因为没有初始化指针而去使用它很危险。

Ref:

http://blog.csdn.net/ryfdizuo/article/details/6435847

http://blog.csdn.net/duan_jin_hui/article/details/50879338

时间: 2024-11-13 06:40:53

C++中swap函数的相关文章

(转)谈谈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

《Effective C 》资源管理:条款25--考虑写出一个不抛出异常的swap函数

条款25考虑写出一个不抛出异常的swap函数 条款25:考虑写出一个不抛出异常的swap函数 swap是STL中的标准函数,用于交换两个对象的数值.后来swap成为异常安全编程(exception-safe programming,条款29)的脊柱,也是实现自我赋值(条款11)的一个常见机制.swap的实现如下: namespace std{ template<typename T> void swap(T& a, T& b) { T temp(a); a=b; b=temp;

条款25:考虑写出一个不抛异常的swap函数

条款25:考虑写出一个不抛异常的swap函数 swap函数在C++中是一个非常重要的函数,但实现也非常复杂. 看一个缺省的std::swap函数的实现 namespace std { template<typename T> void swap( T& a , T& b) { T temp(a); a = b; b = temp } } ①内置类型的调用 int a = 2; int b =3; std::swap(a, b); cout<<"a:&quo

作业二、comp和swap函数

一.swap函数的代码及运行情况 1.代码 1 #include<stdio.h> 2 int main() 3 { 4 void swap(int *m,int *n); 5 int a,b; 6 int *p1,*p2; 7 scanf("%d,%d",&a,&b); 8 p1=&a; 9 p2=&b; 10 swap(p1,p2); 11 printf("%d,%d\n",*p1,*p2); 12 return 0;

关于swap函数传值的问题

#include <stdio.h> void swap(int * p3,int * p4); int main() {  int a = 9;  int b = 8;  int * p1 = &a;  int * p2 = &b;    printf("%x %x\n",p1,p2);  swap(p1,p2);    printf("%d %d\n",a,b);  printf("%d %d\n",*p1,*p2

c/c++和java实现swap函数的不同处

首先我们来看一下在c/c++中实现的swap函数 void swap ( int & a, int & b) { int Temp; temp = a; a = b; b = temp; } 那么在java中是否还能这样呢,很显然java中没有地址引用符号了. 首先我们来看下c/c++和java的区别. 本质区别 C/C++中swap功能的本质:通过传递变量地址(指针或引用)来交换变量地址中的值. Java标榜其中对C/C++一个很大的改进就是:Java对程序员屏蔽了变量地址的概念,减少指

C语言形参与实参的概念及swap函数

形式参数(formal argument)和实际参数(actual argument)是什么? void function(int n); //n为形式参数 int main { int times=5; function(times); //times为实际参数 } void function(int n) { for(int i=0;i<n;i++) printf("hello\n"); } 在声明一个参数时就创建了一个叫形式参数的变量,在上面的例子中形式参数是叫做n的变量.

Effective C++笔记_条款25考虑写出一个不抛出异常的swap函数

1 // lib中的swap 2 namespace std { 3 template<typename T> 4 void swap (T& a, T& b) 5 { 6 T temp(a); 7 a = b; 8 b = temp; 9 } 10 } 11 12 // 缺点:需要赋值大量的数据,但是有的时候并不要复制如此多的内容 13 class WidgetImpl { 14 public: 15 //... 16 private: 17 int a, b, c; 18