为什么我不能将比较器放在节点内?
Why can't I put the comparator inside the node?
我正在使用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;
相关文章:
- std::设置自定义比较器
- C++中"std::sort"比较器的不同类型
- 将 std::set 与基于键的比较器一起使用
- 带自定义比较器的最小优先级队列
- 函数类作为比较器
- 优先级队列自定义比较器
- 什么是自定义比较器以及如何在 C++ 的排序函数中使用它?
- 没有默认构造函数作为模板参数的自定义比较器
- set_intersection使用自定义设置比较器
- 如何为集合 c++ 建立比较器
- C++复杂情况的比较器通过参数问题
- 对于BTreeMap和其他依赖于Ord的东西,是否有等效于C++比较器对象?
- 对没有比较器或λ函数的向量进行排序?
- "operator()"在重载运算符方法中是什么意思,在priority_queue(STL)中用作C++中的比较器?
- 用户定义的结构是否有默认C++比较器?
- C++设置了一个用于排序的比较器和另一个用于唯一性的比较器
- 使用迭代器的自定义比较器函数
- C++对λ比较器EXC_BAD_ACCESS进行排序
- 如果要求比较器是严格的总排序,而不仅仅是严格的弱排序,C++标准算法会更快吗?
- 为什么我不能将比较器放在节点内?