如何在任何 class 中创建一个比较器函数,就像我们在 C++ STL 中的 priority_queue 中所做的那样

How to make a comparator function inside any class just like we make in a priority_queue in c++ STL

就像在 STL 中的 priority_queue 一样,我们可以像这样提供自定义比较函数:

class comp
{
    bool operator()(int a, int b)
    {
        return a>b? 1:0;
    }
};
priority_queue<int, vector<int>, comp> pq;

如何为任何 class 执行此操作?我尝试这样做是为了使用 class c:

比较我的人 class 对象
class person
{
  public:
  int height;
  int age;
  person(int a, int h)
  { 
     age = a;
     height = h;
  }
};

template<class comparator>
class c
{
   public:
   vector<person>p;
   void compare(person p1, person p2)
   {
     if(comparator comp( p1,  p2))
     {
      p.push_back(p1);
     }
   }
};

class compare
{
    bool operator()(person p1, person p2)
    {
        return p1.height> p2.height ? 1:0;
    }
};

然后我创建了 2 个 person 对象和一个 class c 对象“pq”,然后调用 compare 函数,就像我们在 priority_queue 中所做的那样:

person p1(23, 85);
person p2(11, 55);
c <compare> pq;
pq.compare(p1, p2);

但它给出了这个错误。

    error: expected primary-expression before 'comp'
             if(comparator comp(p1, p2))
                           ^~~~

您需要创建一个要与之比较的仿函数的实例,然后调用该实例的 operator()

这个:

if(comparator comp( p1,  p2))

不会那样做。您似乎只是试图在 if 条件下构建一个名为 compcomparator - 这是无法完成的 - 然后实际上没有努力调用 comparator反正。将其更改为:

   void compare(person p1, person p2)
   {
     if (comparator{}(p1, p2)) // fixed
     {
       p.push_back(p1);
     }
   }

即:先用{}构造一个comparator,然后用()调用它的operator()

反过来,这意味着您需要其 operator() 可以通过自身访问:

class compare
{
public: // added (or omit this and change class to struct)
    bool operator()(person p1, person p2)
    {
        return p1.height> p2.height ? 1:0;
    }
};

通过这些更改,它可以正常编译。我没有检查它是否符合你的要求,但你显然需要先修复这些语法错误。