IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++交换 -> 正文阅读

[C++知识库]C++交换

如果一个类定义了自己的swap,那么算法将使用类自定义版本。否则,算法将使用标准库定义的swap。虽然与往常一样我们不知道swap是如何实现的,但理论上很容易理解,为了交换两个对象我们需要进行依次拷贝和两次赋值。例如,交换两个值HasPtr对象的代码可能像下面这样:

HasPtr temp =v1;//创建v1的值的一个临时副本
v1=v2;//将v2的值赋予v1
v2=temp;//将保存的v1的值赋予v2

这段代码将原来的v1中的string拷贝了两次—第一次是HasPtr的拷贝狗杂函数将v1创建给v1拷贝为temp,第二次是赋值运算将temp赋予v2。将v2赋予v1的语句还拷贝了原来v2中的string。如我们所见,拷贝一个值为HasPtr会分配一个新的string并将其拷贝到HasPtr指向的位置。
理论上,这些内存分配都是不必要的。我们更希望swap交换指针,而不是分配string的新副本。即,我们希望这样交换两个HasPtr

string * temp=v1.ps;//为v1.ps中的指针创建一个副本
v1.ps=v2.ps;//将v2.ps中指针赋予v1,ps
v2.ps=temp;//将保存的v1.ps中原来的指针赋予v2.ps

编写我们自己的swap函数

class HasPtr{
	friend void swap(HasPtr&,HasPtr&);
};
inline
void swap(HasPtr &lhs,HasPtr &rhs)
{
	using std::swap;
	swap(lhs.ps,rhs.ps);//交换指针而不是string
	swap(lhs.i,rhs.i);//交换int成员
}

我们首先将swap定义为friend,以便能访问HasPtr的(private的)数据成员,由于swap的存在就是为了优化代码,我们将其声明为inline函数、swap的函数体对给定对象的每个数据成员调用swap。我们首先swap绑定到rhs和lhs的对象的指针成员,然后是int成员

swap函数应该调用swap,而不是std::swap

如果一个类的成员有自己类型特定的swap函数,调用std::swap就是错误的

在赋值运算符中使用swap

定义swap的类通常使用swap来定义它们的赋值运算符。这些运算符使用了一个名为拷贝并交换的技术。这种技术将左侧运算对象与右侧运算对象的一个副本进行交换

//注意rhs是按照值传递的,意味着HasPtr的拷贝构造函数
//将右侧运算对象中的string拷贝到rhs
HasPtr& HasPtr::operator=(HasPtr rhs)
{
	//交换左侧运算对象和局部变量rhs内容
	swap(*this, rhs);//rhs现在指向本对象曾经使用的内存
	return *this;//rhs被销毁,从而delete了rhs中的指针
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-09-02 11:09:57  更:2021-09-02 11:10:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/27 20:34:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计