传递类的私有方法作为std :: sort的比较运算符

kMa*_*ter 4 c++ sorting std

我写一个代码来解决以下问题:给定一组数字x[0],x[1],... x[N-1],发现,使得他们在升序排序的置换.在换句话说,我想找到一个置换{0,2,...,N-1}如i[0],i[1]......,i[N-1]这样x[i[0]] <= x[i[1]] <= ... <= x[i[N-1]].

为此,我将x向量和索引向量i(最初填充i[j] = j)存储为类的私有成员.我还定义了一个私有方法

bool MyClass::compare(size_t s, size_t t) {
    return (x[s] < x[t]);
}
Run Code Online (Sandbox Code Playgroud)

现在,我打电话std::sort如下

std::sort(i.begin(), i.end(), compare);
Run Code Online (Sandbox Code Playgroud)

我期望得到理想的结果.但是代码没有编译,我收到以下错误:

error: no matching function for call to ‘sort(std::vector<long unsigned int>::iterator, std::vector<long unsigned int>::iterator, <unresolved overloaded function type>)’
Run Code Online (Sandbox Code Playgroud)

我必须正确完成所有事情,以及std::sort提及我可以将函数作为比较运算符传递给std::sort(http://www.cplusplus.com/reference/algorithm/sort/)的文档

感谢所有的帮助提前.

Dav*_*eas 9

您的方法存在一些问题.第一个也是最明显的是你不能使用成员函数作为自由函数.为了能够调用compare你需要一个类型MyClass和两个整数的对象.std::sort实现内部将尝试仅使用两个整数参数调用自由(非成员)函数.

除此之外,如果不显式获取其地址,则无法创建指向成员函数的指针.该行std::sort(..., compare);不会为成员函数编译.虽然非成员函数会自动衰减到指向函数的指针,但这并非如此.

在C++ 11中,您可以采用两种不同的解决方案.最通用的是创建一个捕获this参数的lambda :

std::sort(std::begin(i),std::end(i),
          [](int x, int y) { return compare(x,y); }); // or maybe even implement here
Run Code Online (Sandbox Code Playgroud)

另一种方法是将对象和成员函数绑定到仿函数中:

std::sort(std::begin(i),std::end(i),
          std::bind(&MyClass::compare,this,_1,_2));
Run Code Online (Sandbox Code Playgroud)

在最后一种情况下,该std::bind函数将创建一个实现operator()获取两个参数的对象,并将MyClass::compare在指向的对象上调用成员函数this.

两种方法的语义略有不同,但在这种情况下,您可以使用其中任何一种.