为什么STL优先级队列错误地分配了我的类对象
Why is STL priority queue incorrectly sorrting my class objects
我已经重载了<
运算符,如图所示,但每次运行程序时,我的类对象似乎都是随机排序的。
class Node
{
int decimal_value
public:
Node(int decimal) : decimal_value(decimal)
{}
friend bool operator<(const Node& p1, const Node& p2);
};
bool operator<(const Node& p1, const Node& p2)
{
return p1.decimal_value < p2.decimal_value;
}
int main()
{
Node* n1= new Node(5);
Node* n2 = new Node(4);
priority_queue<Node*> my_q;
my_q.push(n1);
my_q.push(n2);
}
这可能是因为我使用了指向节点的指针而不是节点本身吗?如果是这样,我该怎么解决?
priority_queue<Node*> my_q;
将比较类型为Node*
的元素进行排序,它不会为您取消引用这些指针并调用重载运算符。不相关指针的比较有
当你修复这个错误时,会有另一个错误:你永远不会初始化decimal_value
,所以它的值是未定义的/随机的。
一种解决方案是明确指定一个比较器:
struct MyComparator {
bool operator()(const Node*l, const Node*r) const {
return l->decimal_value < r->decimal_value;
}
};
std::priority_queue<Node*, std::vector<Node*>, MyComparator> q;
相关文章:
- 模板,函数使用错误的构造函数来复制我的对象
- 为什么C++无法识别我的对象实例化?
- 为什么当我尝试返回引用时,我的对象仍然被复制
- 为什么我的对象声明不调用默认构造函数?
- 为什么Visual Studio会以不同的方式对待我的对象
- 从我的对象返回静态数组
- 为什么我的对象似乎在不使用new”的情况下在堆上
- 我应该如何声明我的对象才能正确使用这些函数
- 为什么我的对象似乎被创建了两次
- 是否可以在我的对象上停止 std::addressof
- 为什么为我的对象类编译标准优先级队列失败
- STL 列表迭代器不会更新我的对象
- C++-如果我使用映射,我的对象会被删除两次吗
- 不完整的类型 --> 无法从我的对象访问指针值
- 如何停止std/boost::线程复制我的对象而不是传递引用
- 为什么我不能退回我的对象
- 为什么我的对象中的变量被重置为默认值
- 如何为我的对象重载 cout
- 析构函数,不会删除我的对象
- 将我的对象与字符串连接