为什么此代码上的排序算法不调用该类的swap版本?

pie*_*ace 5 c++ algorithm class

我已经在类中描述了交换函数,据我了解,如果类定义了它自己的交换函数,则它应该优先于内置交换函数。

以下两行来自C ++入门,接着出现一个问题,询问您使用类上算法标头中的排序算法,并观察调用交换的次数。

“如果一个类定义了自己的交换,那么该算法将使用该类的特定版本。否则,它将使用该库定义的交换函数。”

class HasPtr{
public:
    friend void swap(HasPtr&, HasPtr&);
    friend bool operator<(const HasPtr&,const HasPtr&);
    HasPtr(const std::string& s=std::string()) : ps(new std::string(s)), i(0){}
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);
    std::cout<<"Swap was called"<<std::endl;
}
bool operator<(const HasPtr& lhs,const HasPtr& rhs){
    return *lhs.ps<*rhs.ps;
}
int main(){
    std::vector<HasPtr>v1{HasPtr("this"),HasPtr("is"),HasPtr("a"),HasPtr("keyboard")};
    std::sort(v1.begin(),v1.end());}
Run Code Online (Sandbox Code Playgroud)

现在,由于对sort的调用使用了<来重新排列元素,并且根据摘录,算法应使用类定义的swap版本,因此,每次算法重新排列元素时都应打印“ swap was被调用”,但似乎并没有并且简单地出现使用默认版本的swap是std :: swap。

L. *_* F. 4

std::sort不需要通过交换元素来对元素进行排序。如果是,那么它将使用正确版本的swap,但它可以选择使用其他方法。例如,它可以调用std::rotate,移动元素范围。