自定义 swap 函数
背景
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 函数相关推荐
- 指针:调用自定义交换函数,完成三个数整从小到大排列
Description 调用自定义交换函数swap(int *p1, int *p2),完成三个整数从小到大排列 Input 多组测试数据,每组输入三个任意整数 Output 输出从小到大排列的三个数 ...
- 《Effective C++》item25:考虑写出一个不抛异常的swap函数
std::swap()是个很有用的函数,它可以用来交换两个变量的值,包括用户自定义的类型,只要类型支持copying操作,尤其是在STL中使用的很多,例如: int main(int argc, _T ...
- 《Effective C++》学习笔记(条款25:考虑写出一个不抛异常的swap函数)
最近开始看<Effective C++>,为了方便以后回顾,特意做了笔记.若本人对书中的知识点理解有误的话,望请指正!!! swap函数是一个非常经典又有用的函数,除了它本身用来交换两个对 ...
- 自定义qsort函数
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.qsort是什么? 二.如何实现自定义qsort 难懂点与易错点 总结 前言 我们已经知道了qsort的功能,那么 ...
- c++语言swap函数,C++中swap函数
本文是我用到swap函数时,对其产生好奇,所以结合网上有关博文写下的.个人水平有限,若有错误的地方,欢迎留言指出.谢谢! 一.通用的函数交换模板 template void swap(T &a ...
- 【FFmpeg】自定义回调函数处理AVIOContext中的数据
1.简述 AVIOContext是FFmpeg管理输入输出数据的结构体,它的成员变量有指向数据的指针.大小以及处理数据的回调函数指针等等.如果使用avio_open或avio_open2来创建,它会根 ...
- 史上自定义 JavaScript 函数Top 10
史上自定义 JavaScript 函数Top 10 http://www.dustindiaz.com/top-ten-javascript/ 发布:wpulog | 发布时间: 2010年4 ...
- 从Swap函数谈加法溢出问题
1. 初始题目 面试题:不用额外的变量,实现一个Swap函数,交换两个参数的值(问题1). 这个题目太经典,也太简单,有很多人都会不假思索结出答案: //Code 1 void Swap(i ...
- ML之Kmeans:利用自定义Kmeans函数实现对多个坐标点(自定义四个点)进行自动(最多迭代10次)分类
ML之Kmeans:利用自定义Kmeans函数实现对多个坐标点(自定义四个点)进行自动(最多迭代10次)分类 目录 输出结果 核心代码 输出结果 核心代码 #!/usr/bin/python # -* ...
最新文章
- 查看当前正在运行的python进程
- C语言 字符串转换成int、long和double型
- 单机启动nacos_dockercompose部署nacos单机版(简洁优化版)
- 微软 SQL Server 2019 将免费支持 Java;Rancher Labs获2500万美元融资;腾讯云进军日本市场……...
- django项目的创建与启动
- js去掉html标签和去掉字符串文本的所有的空格
- 重名剔除(Deduplicate)
- 2.PHP 扩展开始以及内核应用(1) --- PHP 变量在内核中的实现
- cs61A homework4
- php控制表格颜色,php – 表格列的背景颜色
- 有赞会不会成为去中心化流量时代的淘宝
- 2019世界移动通信大会--中国5G迎来高光时刻
- 【手拉手 带你准备电赛】解答小课堂——为什么要使能时钟
- 集团企业邮箱申请哪家的好,怎么选择?
- 你算过这笔账么?月薪5000在中国和美国的生活各是怎样?
- 独上高楼 望尽天涯路
- UESTC 1144 Big Brother
- 图书馆共享计算机,图书馆资源共享中计算机网络技术的使用
- 爬虫-requests库(二)get请求参数的使用 —搜狗搜索后爬取搜索结果
- c语言-学生成绩查找系统
热门文章
- wifi密码那些事儿
- mysql备份耗时太长_Mysql数据不算大,备份却非常慢
- sts 快捷键 /Eclipse 快捷键(sts基本也一样)
- 我的世界服务器死亡信息在哪看,我的世界:死亡记录点?不需要地图,就可以看到“死”在哪里!...
- android launcher 日历图标显示日期
- 电脑硬盘一共有多少种
- iPhone 5C并非失败产品 只因世人误解
- mysql简单命令—常用
- Android 自定义控件-高仿猎豹清理大师自定义内存开口圆环控件
- 工控计算机 isa接口,工控机常见的几种外设和接口