我使用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;
答案 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;