我已经在类中描述了交换函数,据我了解,如果类定义了它自己的交换函数,那么它应该优先于内置交换函数。
以下两行来自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。
答案 0 :(得分:4)
std::sort
通过交换元素对元素进行排序。如果是这样,它将使用正确版本的swap
,但可以选择使用其他方法。例如,它可以调用std::rotate
来移动元素的范围。