当前位置:网站首页>自定义 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;
}
边栏推荐
- i.mx6ull搭建boa服务器详解及其中遇到的一些问题
- i. Mx6ull build boa server details and some of the problems encountered
- 二分图判定
- 【数字IC手撕代码】Verilog无毛刺时钟切换电路|题目|原理|设计|仿真
- HDR image reconstruction from a single exposure using deep CNNs阅读札记
- sizeof关键字
- 基於 QEMUv8 搭建 OP-TEE 開發環境
- Attack and defense world ditf Misc
- Common sense: what is "preservation" in insurance?
- Installation and use of labelimg
猜你喜欢
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
CCNA-思科网络 EIGRP协议
剑指offer刷题记录1
LeetCode刷题(十一)——顺序刷题51至55
Self made j-flash burning tool -- QT calls jlinkarm DLL mode
剪映+json解析将视频中的声音转换成文本
二叉(搜索)树的最近公共祖先 ●●
第4章:再谈类的加载器
Build op-tee development environment based on qemuv8
Data processing skills (7): MATLAB reads the data in the text file TXT with mixed digital strings
随机推荐
2022-07-04 mysql的高性能数据库引擎stonedb在centos7.9编译及运行
(18) LCD1602 experiment
第3章:类的加载过程(类的生命周期)详解
Aardio - 封装库时批量处理属性与回调函数的方法
OpenCV VideoCapture. Get() parameter details
[Digital IC hand tearing code] Verilog burr free clock switching circuit | topic | principle | design | simulation
Force deduction question 500, keyboard line, JS implementation
pytorch_YOLOX剪枝【附代码】
go多样化定时任务通用实现与封装
LeetCode刷题(十一)——顺序刷题51至55
Memorabilia of domestic database in June 2022 - ink Sky Wheel
Leetcode question brushing (XI) -- sequential questions brushing 51 to 55
Data storage (1)
[线性代数] 1.3 n阶行列式
Hardware development notes (10): basic process of hardware development, making a USB to RS232 module (9): create ch340g/max232 package library sop-16 and associate principle primitive devices
做接口测试都测什么?有哪些通用测试点?
软考高级(信息系统项目管理师)高频考点:项目质量管理
Oracle-控制文件及日志文件的管理
Attack and defense world miscall
基於 QEMUv8 搭建 OP-TEE 開發環境