c++指针比较器未编译

c++ pointer comparer not compiling

本文关键字:编译 比较器 指针 c++      更新时间:2023-10-16

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

我猜是因为比较器有问题?这应该非常简单……任何帮助是非常感激的,谢谢!

比较函数不能是类的非静态成员,因为它不是在类的实例上调用的。它可以是静态类函数、独立函数或函子。

根据对问题的评论判断,你可能会发现一个函子是最好的方法。一个函子只是一个实现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);
}

成员函数有一个额外的参数(实例的this指针),因此你的签名不匹配- std::sort需要在没有对象引用的情况下调用函数。

文档还指出它应该满足二进制谓词的要求。

这是一个复制器样本

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(示例)来修复您的代码。

你的第二个错误是第一个错误的直接后果。解决第一个问题,第二个问题也就解决了。

我发现了两个步骤:(假设knapsack.second是矢量)

  1. 定义为bool opeator()(...){...};
  2. sort(knapsack.second.begin(), knapsack.second.end(),*this) .