我想对指针数组进行排序,但是 VS 无法编译,说
'testClass::compareItems': non-standard syntax; use '&' to create a pointer to member
比较器看起来像这样:
bool testClass::compareItems(ElementType *a, ElementType *b)
{
return elementToProfit[a] / a->w() > elementToProfit[b] / b->w();
}
而数组只是一个普通数组。
for (auto &knapsack : knapsacks)
{
std::sort(knapsack.second.begin(), knapsack.second.end(), compareItems);
}
我不太确定发生了什么。 VS 也在提示
'void std::sort(_RanIt,_RanIt)': expects 2 arguments - 3 provided
我猜这是因为比较器有问题?这应该非常简单...非常感谢任何帮助,谢谢!
最佳答案
比较函数不能是类的非静态成员,因为它不是在类的实例上调用的。它可以是静态类函数、独立函数或 functor。 .
从对问题的评论来看,您可能会发现仿函数是最好的前进方式。仿函数只是一个实现 operator()
的类,因此您可以通过函数调用语法使用它的对象。这种方法的好处是该对象可以包含您需要携带以进行比较的其他成员。
typedef std::unordered_map<ElementType*, double> ProfitType;
class functorClass
{
ProfitType & elementToProfit;
public:
functorClass(ProfitType & pt) : elementToProfit(pt) {}
bool operator()(ElementType *a, ElementType *b)
{
return elementToProfit[a] / a->w() > elementToProfit[b] / b->w();
}
};
functorClass functor(elementToProfit);
for (auto &knapsack : knapsacks)
{
std::sort(knapsack.second.begin(), knapsack.second.end(), functor);
}
关于c++指针比较器未编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32976629/