我想对一组指针进行排序,但VS不会编译,说
'testClass :: compareItems':非标准语法;使用 '&安培;'创建指向成员的指针
比较器看起来像这样:
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)':需要2个参数 - 提供3个
我认为这是因为比较器存在问题?这应该是非常容易的......任何帮助都非常值得赞赏,谢谢!
答案 0 :(得分:4)
compare函数不能是类的非静态成员,因为它不是在类的实例上调用的。它可以是静态类函数,独立函数或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);
}
答案 1 :(得分:1)
成员函数有一个额外的参数(实例的this
指针)因此你的签名不匹配 - std::sort
需要在没有对象引用的情况下调用函数。
documentation还声明它应该满足binary predicate的要求。
这是一个样本重现器
struct ElementType {
int w() {
return 2;
}
};
class testClass {
public:
bool compareItems(ElementType *a, ElementType *b)
{
return a->w() < b->w();
}
void sort() {
vector<ElementType*> vecOfPointers;
std::sort(vecOfPointers.begin(), vecOfPointers.end(), compareItems);
}
vector<ElementType*> elementToProfit;
};
您可以通过制作比较函数static
(example)来修复代码。
您的第二个错误是第一个错误的直接后果。修复第一个,你也将解决第二个问题。
答案 2 :(得分:0)
我找到了两个步骤:(假设 Date ID Event PrevEnc PrevEvent
1 2016-09-09 A 1 4 2
2 2016-06-07 A 0 3 2
3 2016-05-06 A 1 2 1
4 2016-02-03 A 0 1 1
5 2016-02-01 A 1 0 0
6 2016-11-08 B 0 4 3
7 2016-06-08 B 1 3 2
8 2016-05-08 B 1 2 1
9 2016-02-03 B 1 1 0
10 2016-01-01 B 0 0 0
是向量)
knapsack.second
; bool opeator()(...){...}
。