我写一个代码来解决以下问题:给定一组数字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/)的文档
感谢所有的帮助提前.
您的方法存在一些问题.第一个也是最明显的是你不能使用成员函数作为自由函数.为了能够调用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.
两种方法的语义略有不同,但在这种情况下,您可以使用其中任何一种.
| 归档时间: |
|
| 查看次数: |
1468 次 |
| 最近记录: |