c ++指针比较器没有编译

时间:2015-10-06 18:04:57

标签: c++ arrays visual-studio pointers

我想对一组指针进行排序,但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个

我认为这是因为比较器存在问题?这应该是非常容易的......任何帮助都非常值得赞赏,谢谢!

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;
};

Example

您可以通过制作比较函数staticexample)来修复代码。

您的第二个错误是第一个错误的直接后果。修复第一个,你也将解决第二个问题。

答案 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 是向量)

  1. 将其定义为knapsack.second;
  2. bool opeator()(...){...}
相关问题