13.3节 交换操作练习

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

using std::swap语句使标准库中的swap可见,重载函数swap在swap(HasPtr &, HasPtr &)中调用时,标准库中的版本匹配度更好,因此不会递归调用。

13.30:为你的值版本的HasPtr编写swap函数,并测试他。为你的swap函数添加一个打印语句,指出函数什么时候执行。

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

#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
class HasPtr {
    friend void swap(HasPtr &, HasPtr &);
    string *ps;
    int i;
public:
    HasPtr(const string &s = string()) :ps(new string(s)), i(0) {};
    HasPtr(const HasPtr &hp) :ps(new string(*hp.ps)), i(hp.i) {};
    HasPtr & operator = (const HasPtr & hp);
    ~HasPtr() { delete ps; }
    bool operator < (const HasPtr &hp) { return *ps < *hp.ps; }
};
HasPtr & HasPtr::operator = (const HasPtr & hp) {
    *ps = *hp.ps;
    i = hp.i;
    return *this;
}

void swap(HasPtr &hp1, HasPtr & hp2) {
    using std::swap;
    swap(*hp1.ps, *hp2.ps);
    swap(hp1.i, hp2.i);
    cout << "use swap() of HasPtr" << endl;
}

int main() {
    string s[] = { "the","quick","red","fox","jump","over", "the","slow", "red","turtle" };
    vector<HasPtr> vhp(begin(s), end(s));
    sort(vhp.begin(), vhp.end());//未调用HasPtr的swap()
    swap(vhp.front(), vhp.back());//调用了HasPtr的swap()

    system("pause");
    return 0;
}

在此情况下,sort函数执行时,并未调用HasPtr版本的swap。何时会调用?经查验,当vector中的元素较少时,sort会采用插入排序法,不会调用swap函数,当元素数量增大到一定数量时,才会采用快速排序法,调用swap函数。

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

觉得不会,引为类指针的版本中,swap的语义就是交换指针本身,与标准库中的版本所表达的是一样的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值