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

时间:2016-10-06 16:10:49

标签: c++ priority-queue

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

 C:\BatchFiles\SO\rmdir>dir /b /s
 C:\BatchFiles\SO\rmdir\cleanup.bat
 C:\BatchFiles\SO\rmdir\lib
 C:\BatchFiles\SO\rmdir\temp
 C:\BatchFiles\SO\rmdir\lib\Debug
 C:\BatchFiles\SO\rmdir\lib\donotdelete
 C:\BatchFiles\SO\rmdir\lib\donotdelete.txt
 C:\BatchFiles\SO\rmdir\lib\Debug\deleteme
 C:\BatchFiles\SO\rmdir\lib\Debug\deleteme.txt
 C:\BatchFiles\SO\rmdir\lib\Debug\deleteme\deleteme.txt
 C:\BatchFiles\SO\rmdir\lib\donotdelete\donotdelete.txt
 C:\BatchFiles\SO\rmdir\temp\deleteme
 C:\BatchFiles\SO\rmdir\temp\deleteme.txt
 C:\BatchFiles\SO\rmdir\temp\deleteme\deleteme.txt

并以下列方式使用它:

 C:\BatchFiles\SO\rmdir>cleanup.bat

 C:\BatchFiles\SO\rmdir>dir /b /s
 C:\BatchFiles\SO\rmdir\cleanup.bat
 C:\BatchFiles\SO\rmdir\lib
 C:\BatchFiles\SO\rmdir\temp
 C:\BatchFiles\SO\rmdir\lib\Debug
 C:\BatchFiles\SO\rmdir\lib\donotdelete
 C:\BatchFiles\SO\rmdir\lib\donotdelete.txt
 C:\BatchFiles\SO\rmdir\lib\donotdelete\donotdelete.txt

但它不起作用。

然后,我转向另一种方式。它有效。

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

我不知道为什么会有区别。任何建议都会很棒。

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

版本1

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

     };
struct com{
    bool operator () (const node& lhs, const node& rhs) const{
             return lhs.val > rhs.val;
         }
};
priority_queue<node, vector<node>, com> queue;

4 个答案:

答案 0 :(得分:4)

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;

答案 1 :(得分:1)

在第一种情况下,node是一个不是比较器 - 相反,它为operator<提供了一个重载,所以你应该使用它:

priority_queue<node, vector<node>> queue;

没有任何第三个论点。这应该有用。

请注意,比较器是一个可以调用的方式:

cmp(x,y)

所以从这个意义上说,你的班级node并不支持 - 但它支持这一点:

x < y

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

答案 2 :(得分:0)

priority_queue在评估期间逐字地调用com(arg1, arg2)

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

答案 3 :(得分:0)

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

以下代码应该有效

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