2016-10-06 56 views
0

我正在使用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; 
+0

,它不是'操作符()'被定义。你可以使用'std :: less '来使其工作,或者只是省略了编译器。 – StoryTeller

+3

您是否注意到'node'结构中的比较运算符和'com'结构中的函数调用运算符之间有什么区别?像一个是***比较运算符***,另一个是***函数调用***运算符? –

+1

不是你需要第一个例子中的额外的模板参数,因为那么将会使用使用'<'运算符的默认'std :: less'。所以在第一个例子中,你需要的是'priority_queue 队列;' –

回答

5

node不是默认并且它没有operator()

由于y您正在使用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; 
0

priority_queue字面上在评估期间调用com(arg1, arg2)

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

1

在第一种情况,node比较器作为这样—相反,它提供了一种过载operator<,因此应使用这样的:

priority_queue<node, vector<node>> queue; 

没有任何第三个参数。这应该工作。

注意,一个比较是一个可以调用为:

cmp(x,y) 

所以在这个意义上说,你node类不支持—它,但是,支持此:

x < y 

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

0

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

下面的代码应该因为你的节点工程

std::priority_queue<node, std::vector<node>> queue; 
相关问题