C++ 常用编程--Swap函数有几种写法?

在说C++模板的方法前,我们先想想C语言里面是怎么做交换的。

举个例子,要将两个int数值交换,是不是想到下面的代码:

void swap(int&a , int &b)
{
int t = a;
a=b;
b=t;
}

如果要求不用临时变量,可考虑异或的方式。

void swap(int&a,int&b)
{
if (&a != &b)
{
a ^= b;
b ^= a;
a ^= b;
}
}

整型数比较容易理解,如果是字符串呢?字符串交换不能直接使用上面类似的方法赋值,想想原因是啥?:)

//伪代码
void swap(char* a,int sizeofa,char*b,int sizeofb)
{
char temp[MAX] ={0};
strncpy(temp,sizeof(temp)-1,a) ;
strncpy(a,sizeofa-1,b);
strncpy(b,sizeofb-1,temp) ;
}

当然如果还可以用指针的指针。

void swap(char** a , char** b)
{
char* tmp = *a ;
*a= *b;
*b= tmp ;
}

上面的方法都是按特定的类型做的处理,有没更通用的写法?

我们来看看C++ 怎么处理交换:

void swap(string& a , string&b)
{
string c(a) ;
a=b;
b=c;
}

是不是和int的很像?

我们再来看看标准库里面swap的算法是怎么实现的:

namespace std {
template<typename T>
void swap(T &a,T &b) {
T temp(a);
a = b;
b = temp;
}
}

template 是c++里面很重要的概念,利用模板可以实现很多通用的算法。上面的std::swap要求T类实现拷贝构造函数,并且和上面几个实现一样都需要做赋值运算,在海量的交易请求里面会损耗性能。

因此在C++11的标准里面对实现做了优化。看看上面字符串类的交换只需要交换地址即可,根据这种思路在通用的swap只交换指针,而不是赋值。这样的实现能将性能提高不少,对大型对象效率明显提现。

template<typename T>
void swap(T& a,T&b) {
T temp(std::move(a));
a = std::move(b);
b = std::move(temp);
}

std::move 是不是很陌生:)它是C++11的新概念,在内部实现只是做了cast。

template<typename T>
decltype(auto) move(T&& param)
{
using ReturnType = remove_reference_t<T>&&;
return static_cast<ReturnType>(param);
}

C++ 常用编程--Swap函数有几种写法? https://www.cppentry.com/bencandy.php?fid=49&id=265714

编程资料 https://www.cppentry.com

C++ 常用编程--Swap函数有几种写法?的更多相关文章

  1. swap函数的四种写法

    swap 函数的四种写法 (1)经典型 --- 嫁衣法 void swap(int *a, int *b) { int temp; temp = *a; *a = *b; *b = temp; } ( ...

  2. swap()函数的几种写法及优劣

    试用几种方法实现swap函数,比较效率高低. 首先说结果,最快的是赋值交换. 原因分析 gcc开启O2优化后,三个函数的汇编代码一样.是的,除了第一行的文件名,一模一样. 附代码 void swap1 ...

  3. javascript立即调用的函数表达式N种写法(第二篇)

    原文:javascript立即调用的函数表达式N种写法(第二篇) 上一篇博客我谈到将函数声明转换为函数表达式最常见的一种写法是:通过括号()将匿名函数声明转换为函数表达式即(function(){}) ...

  4. javascript函数的几种写法集合

    1.常规写法 function fnName(){ console.log("常规写法"); } 2.匿名函数,函数保存到变量里 var myfn = function(){ co ...

  5. Javascript函数的几种写法

    最近在看某个插件的源码时,总是看到各种不同风格的js函数的写法.(怪我只是初级水平,看的一头雾水) 于是想找点资料,总结总结,心里不清不楚的总是很别扭! 1.常规写法 // 函数写法 function ...

  6. Sql函数的三种写法

    以前复制的创建sql函数比较乱,现在将我自己项目中的三种sql函数做下对比,一目了然: (1)表值函数——方法一:直接创建临时表,并返回临时表.优点:函数体中间可以直接申明临时变量,并做各种逻辑处理, ...

  7. js自调用匿名函数的三种写法

    第一种: (function(){ console.log(‘hello world”) })() 第二种: (function(){ console.log(‘hello world’) }()) ...

  8. 关于transition回调函数的几种写法

    平时工作中经常遇到需要transition动画结束后触发某个功能的问题,但是在映像中好像只见过animate的回调函数, 而transition的很多属性无法在animate中使用,经过一些总结归纳, ...

  9. JS自执行函数的几种写法

    一:整体写在一个括号中 代码如下: (function Show(){alert("hello");}()) 二:function函数整体外加括号 代码如下: (function ...

随机推荐

  1. rhel

    1.查看硬盘大小 df -h 2.查看内存大小 free -h 3.配置主键名称 vim /etc/hostname# 查看 hostnamehostname 4.挂载镜像 mkdir -p /med ...

  2. 异数OS TCP协议栈测试(一)--数据传输篇

    异数OS TCP协议栈测试(一)--数据传输篇 本文来自异数OS社区 github:   异数OS-织梦师(消息中间件)群: 476260389 测试目标 数据传输IO性能测试,主要是建立连接后测试收 ...

  3. java"小心机"(1)【资源彩蛋!】

    每天进步一点点,距离大腿又近一步! 阅读本文大概需要9分钟 java"小心机"系列文章在此开篇.在这,将会给你带来曾经错过.忽略或感到模糊的知识,也许它很基础,微不足道,但它能修复 ...

  4. 玩转Django2.0---Django笔记建站基础十三(第三方功能应用)

    第13章 第三方功能应用 在前面的章节中,我们主要讲述Django框架的内置功能以及使用方法,而本章主要讲述Django的第三方功能应用以及使用方法.通过本章的学习,读者能够在网站开发过程中快速开发网 ...

  5. c#移位运算符("<<"及">>")

    C#是用<<(左移) 和 >>(右移) 运算符是用来执行移位运算. 左移 (<<) 将第一个操作数向左移动第二个操作数指定的位数,空出的位置补0.  左移相当于乘. ...

  6. OpenCV2.4.13+VS2013配置方法

    先说一下vc几代表的对应版本: vc8 = Visual Studio 2005 vc9 = Visual Studio 2008 vc10 = Visual Studio 2010 vc11 = V ...

  7. CSS-05-伪类及伪元素选择器

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. 工具 之uniq

    uniq命令的作用:显示唯一的行,对于那些连续重复的行只显示一次!接下来通过实践实例说明. [关键字] Linux Shell uniq 看test.txt文件的内容,可以看到其中的连续重复行 [ro ...

  9. 如何使用jmeter做一个功能的性能测试

    一.为什么又再次写类似的文章? 在博客园和公号写文章,已经快两年了,所以自然在公号和博客园都能联系到我的. 也就是几天前,有个人加我微信,对于总有人加我好友,我已经觉得不奇怪了,为什么呢? 加我好友的 ...

  10. yum管理及源码安装

    一.配置YUM库及更新操作 yum概述 基于RPM包构建的软件更新机制,自动解决软件依赖关系 YUM仓库格式 本地:file:// 网络:ftp://或http:// yum源里面包含的内容 .rpm ...