您的位置:首页 > 其它

第十三章 13.3节练习

2014-09-12 17:40 127 查看
练习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页的一些内容(优化部分说的也不是很多)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: