第十三章 13.3节练习

来源:互联网 发布:programming python 编辑:程序博客网 时间:2024/06/06 18:14

练习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函数添加一个答应语句,指出函数什么时候执行。

解答:

inlinevoid 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