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

时间:2019-09-16 12:45:05

标签: 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());}

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

1 个答案:

答案 0 :(得分:4)

不需要

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