天天看點

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() {};
    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 ;
}
           

在此情況下,sort函數執行時,并未調用HasPtr版本的swap。何時會調用?經查驗,當vector中的元素較少時,sort會采用插入排序法,不會調用swap函數,當元素數量增大到一定數量時,才會采用快速排序法,調用swap函數。

13.32:類指針的HasPtr版本會從swap函數受益嗎?如果會,得到什麼益處?如果不會,為什麼?

覺得不會,引為類指針的版本中,swap的語義就是交換指針本身,與标準庫中的版本所表達的是一樣的。