为什么我不能将比较器放在节点内?

Why can't I put the comparator inside the node?

本文关键字:节点 比较器 不能 为什么      更新时间:2023-10-16

我正在使用priority_queue来解决问题。我打算用下面的方式声明我的节点。

struct node{
         int x, y, val;
         node(int _x, int _y, int _val){
             x = _x;
             y = _y;
             val = _val;
         }
         bool operator < (const node& rhs) const{
             return val > rhs.val;
         }
     };

,并按以下方式使用:

priority_queue<node, vector<node>, node> queue;

但是行不通。

然后,我换了另一种方式。它的工作原理。

struct node{
         int x, y, val;
         node(int _x, int _y, int _val){
             x = _x;
             y = _y;
             val = _val;
         }
     };
struct com{
    bool operator () (const node& lhs, const node& rhs) const{
             return lhs.val > rhs.val;
         }
};
priority_queue<node, vector<node>, com> queue;

我不知道为什么有区别。有什么建议就太好了。

给出以下答案,我尝试了不同的方法来运行我的代码,它们都有效:

第1版
struct node{
         int x, y, val;
         node(int _x, int _y, int _val){
             x = _x;
             y = _y;
             val = _val;
         }
         node(){}
        bool operator () (const node& lhs, const node& rhs) const{
         return lhs.val > rhs.val;
     }
 };
priority_queue<node, vector<node>, node> queue;
版本2:

struct node{
         int x, y, val;
         node(int _x, int _y, int _val){
             x = _x;
             y = _y;
             val = _val;
         }
    bool operator < (const node& rhs) const{
         return val > rhs.val;
     }
 };
priority_queue<node, vector<node>, less<node>> queue;
//or
//priority_queue<node, vector<node>> queue;
//or
//priority_queue<node> queue;

node不是默认可构造的,也没有operator()

由于您使用的是operator<,因此不需要指定比较器,因为默认值是std::less<T>,如果可用,则使用它。如果不需要指定比较器,也没有理由指定容器,因为std::vector<T>已经是默认的了。

priority_queue<node, vector<node>, less<node>> queue; 
// same as
priority_queue<node, vector<node>> queue;
// also same as
priority_queue<node> queue;

在第一种情况下,node比较器,因此—相反,它为operator<提供了一个重载,所以您应该使用:

priority_queue<node, vector<node>> queue;

没有任何第三个参数。应该可以。

请注意,比较器可以调用为:

cmp(x,y)

所以在这个意义上,你的类node不支持—但是,它支持以下操作:

x < y

是一个不同的东西,因此,可以与std::priority_queue使用的默认比较器std::less<T>一起使用。

priority_queue在求值过程中直接调用com(arg1, arg2)

该函数需要作为函数对象可用(就像在您的示例中一样),静态函数或lambda。您的第一个struct没有这些

因为第三个模板参数只接受compareFunction(objA, objB)格式。缺省情况下,它是class Compare = std::less<typename Container::value_type>, std::less调用操作符<()。

下面的代码应该可以工作

std::priority_queue<node, std::vector<node>> queue;