背景

STL 中提供了 swap 算法,用于交换两个对象的值,其一般实现方法如下:

namespace std{template<typename T>void swap( T&a,T&b )
{T temp(a);//拷贝构造a = b;//拷贝赋值b = temp;//拷贝赋值}
}

资源管理类

①.概述

通常包含资源(指针)的类需要提供自定义的拷贝构造函数及拷贝赋值运算符。

②.类定义

class demoClass
{public:demoClass(const string& s = string()) :str(new string(s)) { cout << "构造函数执行" << endl; }demoClass(const demoClass& d):str(new string(*d.str)){cout << "拷贝构造函数执行" << endl;}demoClass& operator=(const demoClass& d){cout << "拷贝赋值函数执行" << endl;auto newStr = new string(*d.str);//拷贝底层资源delete str;//释放旧资源str = newStr;//赋新值return *this;}~demoClass(){ cout << "析构函数执行" << endl;delete str;  }private:string* str;//指针
};

③.默认 swap 操作

默认的 swap 算法会执行一次拷贝构造函数及两次拷贝赋值运算符,若对于比较大的资源会比较耗时。

int main()
{demoClass d1 = demoClass("123");demoClass d2 = demoClass("456");cout << "执行 swap " << endl;swap(d1, d2);system("pause");return 0;
}

④.自定义高效 swap

对应包含较大资源的类,交换时直接交换指针即可。把自定义的 swap 函数定义为类的友元函数以访问私有成员。

class demoClass
{public:friend void swap(demoClass& d1, demoClass& d2) noexcept;//定义为友元/*同上*/private:string* str;//指针
};void swap(demoClass& d1, demoClass& d2) noexcept
{using std::swap;swap(d1.str, d2.str);//交换指针
}int main()
{demoClass d1 = demoClass("123");demoClass d2 = demoClass("456");cout << "执行 swap " << endl;swap(d1, d2);system("pause");return 0;
}

自定义 swap 函数相关推荐

  1. 指针:调用自定义交换函数,完成三个数整从小到大排列

    Description 调用自定义交换函数swap(int *p1, int *p2),完成三个整数从小到大排列 Input 多组测试数据,每组输入三个任意整数 Output 输出从小到大排列的三个数 ...

  2. 《Effective C++》item25:考虑写出一个不抛异常的swap函数

    std::swap()是个很有用的函数,它可以用来交换两个变量的值,包括用户自定义的类型,只要类型支持copying操作,尤其是在STL中使用的很多,例如: int main(int argc, _T ...

  3. 《Effective C++》学习笔记(条款25:考虑写出一个不抛异常的swap函数)

    最近开始看<Effective C++>,为了方便以后回顾,特意做了笔记.若本人对书中的知识点理解有误的话,望请指正!!! swap函数是一个非常经典又有用的函数,除了它本身用来交换两个对 ...

  4. 自定义qsort函数

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.qsort是什么? 二.如何实现自定义qsort 难懂点与易错点 总结 前言 我们已经知道了qsort的功能,那么 ...

  5. c++语言swap函数,C++中swap函数

    本文是我用到swap函数时,对其产生好奇,所以结合网上有关博文写下的.个人水平有限,若有错误的地方,欢迎留言指出.谢谢! 一.通用的函数交换模板 template void swap(T &a ...

  6. 【FFmpeg】自定义回调函数处理AVIOContext中的数据

    1.简述 AVIOContext是FFmpeg管理输入输出数据的结构体,它的成员变量有指向数据的指针.大小以及处理数据的回调函数指针等等.如果使用avio_open或avio_open2来创建,它会根 ...

  7. 史上自定义 JavaScript 函数Top 10

    史上自定义 JavaScript 函数Top 10 http://www.dustindiaz.com/top-ten-javascript/     发布:wpulog | 发布时间: 2010年4 ...

  8. 从Swap函数谈加法溢出问题

    1.      初始题目 面试题:不用额外的变量,实现一个Swap函数,交换两个参数的值(问题1). 这个题目太经典,也太简单,有很多人都会不假思索结出答案: //Code 1 void Swap(i ...

  9. ML之Kmeans:利用自定义Kmeans函数实现对多个坐标点(自定义四个点)进行自动(最多迭代10次)分类

    ML之Kmeans:利用自定义Kmeans函数实现对多个坐标点(自定义四个点)进行自动(最多迭代10次)分类 目录 输出结果 核心代码 输出结果 核心代码 #!/usr/bin/python # -* ...

最新文章

  1. 查看当前正在运行的python进程
  2. C语言 字符串转换成int、long和double型
  3. 单机启动nacos_dockercompose部署nacos单机版(简洁优化版)
  4. 微软 SQL Server 2019 将免费支持 Java;Rancher Labs获2500万美元融资;腾讯云进军日本市场……...
  5. django项目的创建与启动
  6. js去掉html标签和去掉字符串文本的所有的空格
  7. 重名剔除(Deduplicate)
  8. 2.PHP 扩展开始以及内核应用(1) --- PHP 变量在内核中的实现
  9. cs61A homework4
  10. php控制表格颜色,php – 表格列的背景颜色
  11. 有赞会不会成为去中心化流量时代的淘宝
  12. 2019世界移动通信大会--中国5G迎来高光时刻
  13. 【手拉手 带你准备电赛】解答小课堂——为什么要使能时钟
  14. 集团企业邮箱申请哪家的好,怎么选择?
  15. 你算过这笔账么?月薪5000在中国和美国的生活各是怎样?
  16. 独上高楼 望尽天涯路
  17. UESTC 1144 Big Brother
  18. 图书馆共享计算机,图书馆资源共享中计算机网络技术的使用
  19. 爬虫-requests库(二)get请求参数的使用 —搜狗搜索后爬取搜索结果
  20. c语言-学生成绩查找系统

热门文章

  1. wifi密码那些事儿
  2. mysql备份耗时太长_Mysql数据不算大,备份却非常慢
  3. sts 快捷键 /Eclipse 快捷键(sts基本也一样)
  4. 我的世界服务器死亡信息在哪看,我的世界:死亡记录点?不需要地图,就可以看到“死”在哪里!...
  5. android launcher 日历图标显示日期
  6. 电脑硬盘一共有多少种
  7. iPhone 5C并非失败产品 只因世人误解
  8. mysql简单命令—常用
  9. Android 自定义控件-高仿猎豹清理大师自定义内存开口圆环控件
  10. 工控计算机 isa接口,工控机常见的几种外设和接口