当前位置:网站首页>自定义 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;
}


边栏推荐
- MySQL----初识MySQL
- [线性代数] 1.3 n阶行列式
- Aardio - 封装库时批量处理属性与回调函数的方法
- Data processing skills (7): MATLAB reads the data in the text file TXT with mixed digital strings
- [leetcode daily clock in] 1020 Number of enclaves
- 图像的spatial domain 和 frequency domain 图像压缩
- 手写ABA遇到的坑
- Support multiple API versions in flask
- (18) LCD1602 experiment
- AI enterprise multi cloud storage architecture practice | Shenzhen potential technology sharing
猜你喜欢
随机推荐
[linear algebra] determinant of order 1.3 n
十二、启动流程
Seata聚合 AT、TCC、SAGA 、 XA事务模式打造一站式的分布式事务解决方案
硬件開發筆記(十): 硬件開發基本流程,制作一個USB轉RS232的模塊(九):創建CH340G/MAX232封裝庫sop-16並關聯原理圖元器件
柔性数组到底如何使用呢?
NPDP认证|产品经理如何跨职能/跨团队沟通?
Classic sql50 questions
剑指offer刷题记录1
PVL EDI 项目案例
LeetCode 练习——剑指 Offer 26. 树的子结构
C # réalise la liaison des données du rapport Crystal et l'impression du Code à barres 4
2022-07-05 使用tpcc对stonedb进行子查询测试
Attack and defense world ditf Misc
0 basic learning C language - interrupt
414. The third largest digital buckle
OpenCV VideoCapture. Get() parameter details
Common sense: what is "preservation" in insurance?
return 关键字
qt quick项目offscreen模式下崩溃的问题处理
Aardio - 封装库时批量处理属性与回调函数的方法








