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. django.db.migrations.exceptions.MigrationSchemaMissing和raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)

    1.使用Python3.7 + Django2.2 + MySQL 5.5 在执行(python manage.py migrate)命令时出现错误django.db.migrations.excep ...

  2. 为什么Mozilla Thunderbird无法登陆腾讯企业邮?

    (一)问题描述 登陆腾讯企业邮提示"无法登录到服务器.可能是配置.用户名或者密码错误." (二)解决方案 手动配置 IMAP | imap.exmail.qq.com | 993 ...

  3. Java.Json模板.省市区三级JSON

    [ { "name": "北京市", "city": [ { "name": "北京市", &quo ...

  4. Python线程-死锁

    死锁产生的4个必要条件:    1.互斥:一个资源同一时刻只允许一个线程进行访问.    2.占有未释放:一个线程占有资源,且没有释放资源.    3.不可抢占:一个已经占有资源的线程无法抢占到其他线 ...

  5. 4、python基础语法

    前言:本文主要介绍python的一些基础语法,包括标识符的定义.行和缩进.引号和注释.输入输出.变量的定义. 一.标识符 1.凡是我们自己取的名字,都是标识符. 2.在Python里,标识符由字母.下 ...

  6. fastjson中Map与JSONObject互换

    1.//将map转换成jsonObject JSONObject itemJSONObj = JSONObject.parseObject(JSON.toJSONString(itemMap)); 将 ...

  7. java.sql.Date与java.sql.Date区别

    public static void main(String[] args) { java.sql.Date createTime = new java.sql.Date(System.current ...

  8. python3操作PyMySQL笔记

    python3操作mysql需要先安装PyMySQL pip install PyMySQL 在linux登录mysql ,并且在安装数据库时设置了数据库的用户名“root”和密码“root”,mys ...

  9. 2018CCPC吉林赛区(重现赛)部分题解

    The Fool 题目链接 Problem Description The Fool is numbered 0 – the number of unlimited potential –and th ...

  10. Shell常用语句及结构

    条件判断语句之if if 语句通过关系运算符判断表达式的真假来决定执行哪个分支:shell有三种if语句样式,如下: 语句1 if [ expression ] then Statement(s) t ...