当前位置:网站首页>自定义 swap 函数
自定义 swap 函数
2022-07-06 14:53:00 【litanyuan】
背景
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;
}
边栏推荐
- Management background --5, sub classification
- Unity3D学习笔记6——GPU实例化(1)
- MySQL----初识MySQL
- 2022-07-05 使用tpcc对stonedb进行子查询测试
- PVL EDI 项目案例
- 中国1,4-环己烷二甲醇(CHDM)行业调研与投资决策报告(2022版)
- Web APIs DOM time object
- Learn the principle of database kernel from Oracle log parsing
- 2022-07-04 mysql的高性能数据库引擎stonedb在centos7.9编译及运行
- MySQL教程的天花板,收藏好,慢慢看
猜你喜欢
将MySQL的表数据纯净方式导出
Learn the principle of database kernel from Oracle log parsing
硬件開發筆記(十): 硬件開發基本流程,制作一個USB轉RS232的模塊(九):創建CH340G/MAX232封裝庫sop-16並關聯原理圖元器件
Web APIs DOM 时间对象
二叉(搜索)树的最近公共祖先 ●●
Notes de développement du matériel (10): flux de base du développement du matériel, fabrication d'un module USB à RS232 (9): création de la Bibliothèque d'emballage ch340g / max232 SOP - 16 et Associa
signed、unsigned关键字
二分图判定
C # réalise la liaison des données du rapport Crystal et l'impression du Code à barres 4
Build op-tee development environment based on qemuv8
随机推荐
2022-07-05 stonedb sub query processing parsing time analysis
做接口测试都测什么?有哪些通用测试点?
图像的spatial domain 和 frequency domain 图像压缩
2022-07-04 mysql的高性能数据库引擎stonedb在centos7.9编译及运行
AI 企业多云存储架构实践 | 深势科技分享
2022-07-04 the high-performance database engine stonedb of MySQL is compiled and run in centos7.9
Lora sync word settings
3DMAX assign face map
Heavyweight news | softing fg-200 has obtained China 3C explosion-proof certification to provide safety assurance for customers' on-site testing
return 关键字
How do I write Flask's excellent debug log message to a file in production?
自制J-Flash烧录工具——Qt调用jlinkARM.dll方式
Memorabilia of domestic database in June 2022 - ink Sky Wheel
Attack and defense world ditf Misc
go多样化定时任务通用实现与封装
第3章:类的加载过程(类的生命周期)详解
[线性代数] 1.3 n阶行列式
AI enterprise multi cloud storage architecture practice | Shenzhen potential technology sharing
Assembly and Interface Technology Experiment 6 - ADDA conversion experiment, AD acquisition system in interrupt mode
C # realizes crystal report binding data and printing 4-bar code