繁体   English   中英

如何在任何 class 中制作比较器 function 就像我们在 c++ Z2523E0C272CB6766F782 中的 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 中一样,我们可以像这样对 function 进行自定义比较:

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

我该如何为任何 class 执行此操作? 我尝试这样做来比较我的人 class object 使用class c

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

and then I created 2 person objects and a class c object "pq", then called the compare function like we do in 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;
    }
};

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM