第十三章 13.3节练习

练习13.29

解释swap(HasPtr&, HasPtr&)中对swap的调用不会导致递归循环。

解答:

inline void swap(HasPtr &lhs, HasPtr &rhs){
  using std::swap;
  swap(lhs.ps, rhs.ps);
  swap(lhs.i, rhs.i);
}
这是swap的实现,这里不会产生递归调用。

这里swap重载了,在HasPtr中的swap调用中,不会再去调用自身。

因为,在HasPtr的swap函数中使用的是标准库中的swap函数。


练习13.30

为你的类值版本的HasPtr编写swap函数,并测试它。为你swap函数添加一个答应语句,指出函数什么时候执行。

解答:

inline
void swap(HasPtr &lhs, HasPtr &rhs)
{
  std::cout << "call HasPtr's swap function." << std::endl;
        using std::swap;
        swap(lhs.ps, rhs.ps); // swap the pointers, not the string data
        swap(lhs.i, rhs.i);   // swap the int members
}

HasPtr f(HasPtr hp)  // HasPtr passed by value, so it is copied
{
        HasPtr ret = hp; // copies the given HasPtr
        HasPtr cp;
        swap(ret, cp); // will call HasPtr::swap
        // process ret
        return ret;      // ret and hp are destroyed
}

练习13.31

为你的HasPtr类定义一个<运算符,并定义一个HasPtr的vector。为这个vector添加一些元素,并对它执行sort。注意何时会调用swap。

解答:

</pre><pre name="code" class="cpp">bool HasPtr::operator<(const HasPtr &rhs)
{
<span style="white-space:pre">	</span>if (*ps > *(rhs.ps)){
<span style="white-space:pre">		</span>return false;
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>if (i > rhs.i){
<span style="white-space:pre">		</span>return false;
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>return true;
}

在我的执行结果里面,没有调用到swap(),不知道题目里面问“何时会调用swap”是什么意思。


练习13.32

类指针的HasPtr版本会从swap函数受益吗?如果会,得到了什么益处?如果不是,为什么?

解答:

这个会的,使用指针不用分配新的空间出来,节省了分配空间的时间。

同样,对类中使用inline也能作为优化的一种手段。

具体可以查看458页的一些内容(优化部分说的也不是很多)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值