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中的指针
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值