练习13.29 解释swap(HasPtr&, HasPtr&)中对swap的调用不会导致递归循环。
程序未找到自定义的swap函数,故调用的是标准库函数中的swap函数。
练习13.30 为你的类值版本的HasPtr编写swap函数,并测试它。为你的swap函数添加一个打印语句,指出函数什么时候执行。
void swap(HasPtr &lhs, HasPtr &rhs)
{
using std::swap;
swap(lhs.ps, rhs.ps);
swap(lhs.i, rhs.i);
cout << "used swap()" << endl;
}
练习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&);
friend bool operator<(HasPtr &lhs, HasPtr &rhs)
{
return *lhs.ps < *rhs.ps;
}
friend string &print(const HasPtr &m){
return *m.ps;
}
public:
HasPtr(const std::string &s = std::string()) :ps(new std::string(s)), i(0) {}
HasPtr(const HasPtr &m) :ps(new std::string(*m.ps)), i(m.i) {}
HasPtr& operator=(const HasPtr &rhs)
{
auto newp = new std::string(*rhs.ps);
delete ps;
ps = newp;
i = rhs.i;
return *this;
}
~HasPtr() { delete ps; }
private:
std::string *ps;
int i;
};
inline
void swap(HasPtr &lhs, HasPtr &rhs)
{
using std::swap;
swap(lhs.ps, rhs.ps);
swap(lhs.i, rhs.i);
cout << "used swap()" << endl;
}
int main()
{
HasPtr s1("McGrady");
HasPtr s2("Paul");
HasPtr s3("Kobe");
HasPtr s4("Pierce");
HasPtr s5("Aldridge");
vector<HasPtr> svec{ s1,s2,s3,s4,s5 };
sort(svec.begin(), svec.end());
for (auto &i : svec) {
cout << print(i) << " ";
}
}
练习13.32 类指针的HasPtr版本会从swap函数受益吗?如果会,得到了什么益处?如果不是,为什么?
相比于类值版本的swap函数,指针版本交换的数据成员原本就是指针和整型,并没有优化的效果,所以应该没有得到益处。