C++ 中的Swap函数写法汇总
swap函数几乎是所有初学者都写过的一个最基本的函数之一,通常是用它来了解函数概念、形参与实参、引用和指针。然而,这个极为基础的函数却有着非常重要的作用。正因为它的重要性、普遍性,意味着swap函数必须有着极高的安全性。本文给大家介绍C++常用编程--Swap函数有几种写法?
在说C++模板的方法前,我们先想想C语言里面是怎么做交换的。
举个例子,要将两个int数值交换,是不是想到下面的代码:
voidswap(int&a,int&b) { intt=a; a=b; b=t; }
如果要求不用临时变量,可考虑异或的方式。
voidswap(int&a,int&b) { if(&a!=&b) { a^=b; b^=a; a^=b; } }
整型数比较容易理解,如果是字符串呢?字符串交换不能直接使用上面类似的方法赋值,想想原因是啥?:)
//伪代码 voidswap(char*a,intsizeofa,char*b,intsizeofb) { chartemp[MAX]={0}; strncpy(temp,sizeof(temp)-1,a); strncpy(a,sizeofa-1,b); strncpy(b,sizeofb-1,temp); }
当然如果还可以用指针的指针。
voidswap(char**a,char**b) { char*tmp=*a; *a=*b; *b=tmp; }
上面的方法都是按特定的类型做的处理,有没更通用的写法?
我们来看看C++怎么处理交换:
voidswap(string&a,string&b) { stringc(a); a=b; b=c; }
是不是和int的很像?
我们再来看看标准库里面swap的算法是怎么实现的:
namespacestd{ templatevoidswap(T&a,T&b){ Ttemp(a); a=b; b=temp; } }
template是c++里面很重要的概念,利用模板可以实现很多通用的算法。上面的std::swap要求T类实现拷贝构造函数,并且和上面几个实现一样都需要做赋值运算,在海量的交易请求里面会损耗性能。
因此在C++11的标准里面对实现做了优化。看看上面字符串类的交换只需要交换地址即可,根据这种思路在通用的swap只交换指针,而不是赋值。这样的实现能将性能提高不少,对大型对象效率明显提现。
templatevoidswap(T&a,T&b){ Ttemp(std::move(a)); a=std::move(b); b=std::move(temp); }
std::move是不是很陌生:)它是C++11的新概念,在内部实现只是做了cast。
templatedecltype(auto)move(T&¶m) { usingReturnType=remove_reference_t &&; returnstatic_cast (param); }
C++常用编程--Swap函数有几种写法?https://www.cppentry.com/bencandy.php?fid=49&id=265714
编程资料https://www.cppentry.com
总结
到此这篇关于C++中的Swap函数写法汇总的文章就介绍到这了,更多相关C++Swap函数内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。