当前位置: 首页 > 知识库问答 >
问题:

运行时对象指针的C优先级队列错误为无效堆

茹展鹏
2023-03-14

我已经尝试在c中实现一个优先级队列大约5个小时了。

我不相信我的比较仿函数在做它应该做的事情,但是对我来说,我不知道为什么。

在我的Node类的底部,我有一个结构CompareNode,Node类有一个返回int成员变量的函数。

 class Node
 {
 public:
     Node();
     ~Node();
     Node(const Node &obj);

     int GetX() const { return x; }
     int GetY() const { return y; }
     int GetG() const { return g; }
     int GetH() const { return h; }
     int GetF() const { return f; }
     int GetTerrainPenalty() const { return terrainPenalty; }
     bool GetOpenList() const { return openList; }
     bool GetClosedList() const { return closedList; }
     Node* GetParentNode() const { return parentNode; }
     std::vector<Node*> const GetNeighbours() { return neighbours; }

     void SetX(int x) { this->x = x; }
     void SetY(int y) { this->y = y; }
     void SetG(int g) { this->g = g; }
     void SetH(int h) { this->h = h; }
     void SetF(int f) { this->f = f; }
     void SetTerrainPenalty(int t) { this->terrainPenalty = t; }
     void SetOpenList(bool b) { this->openList = b; }
     void SetClosedList(bool b) { this->closedList = b; }
     void SetParentNode(Node* n) { this->parentNode = n; }
     void SetNeighbours(std::vector<Node*> n) { this->neighbours = n; }

     void AddNeighbour(Node* n) { neighbours.push_back(n); }

     // Manahattan Distance
     void CalculateH(Node* end);
     void CalculateF();

 private:
     int x;
     int y;
     int g;
     int h;
     int f;
     int terrainPenalty;
     bool openList;
     bool closedList;
     Node* parentNode;
     std::vector<Node*> neighbours;

 };

 struct CompareNode
 {
     bool operator()(const Node* lhs, const Node* rhs) const
     {
         return lhs->GetF() < rhs->GetF();
     }
 };

在我的main.cpp我声明优先级队列。

 std::priority_queue<Node*, std::vector<Node*>, CompareNode> openList;

我得到一个调试断言失败错误,无效堆。

在调试时,我调用openList时似乎是这样。top()它没有返回正确的节点。

共有1个答案

东方栋
2023-03-14

我的精神调试能力告诉我,因为您没有为您的Node实现复制构造函数,所以您不小心在某个地方复制了它,导致了双重删除。

 类似资料:
  • 我刚开始学习C语言,有一半的时间我不知道自己在做什么,花了好几个小时在谷歌上搜索,盲目地在我的项目中输入代码,这可能是一个基本的问题,但我似乎不能正确地理解它。 这是我作业的要求,我需要这些: 在“边”类中: 在Graph类中: 我在声明优先级队列时遇到问题。细节: 如果我直接使用这些,edge类会给我一个错误“必须有类的参数”,我知道我不能将两个指针重载到bool运算符中,所以我尝试了以下方法:

  • 我正在进行数据结构考试,我正在准备一系列复习题。我的问题如下: “假设你的朋友来找你,声称他发明了一个超快速的基于优先级的比较队列。优先级队列的速度如下(n 是当前在优先级队列中的项目数):a. 在 O(sqrt(logn))时间插入新项目 b. 在 O(sqrt(logn)) 时间从队列中提取(删除并返回)最小项目。 解释为什么你的朋友一定在撒谎: 据我所知,标准优先级队列的运行时间是用于提取的

  • 我所拥有的是一个类,它创建了一个具有优先级、到达时间和完成时间的对象。我还有许多优先级队列可以将它们放入其中。当我开始时,我将它们放入到达队列中,对它们进行排序,然后查看哪个第一个进入,并将其放入队列中。但是,当我尝试向到达队列添加第二个队列时,它会失败并抛出一个异常。我首先要做的是将所有进程添加到到达队列中,然后对它们进行排序,这样到达时间最短的进程将是到达队列中第一个进入队列的进程。谢谢你帮忙

  • 我正在实现一个应用程序,该应用程序根据曼哈顿距离查找(x,y)平面中给定位置的最近n个事件。我使用最大优先级队列来存储找到的事件,并使用曼哈顿距离比较器。这个队列应该总是有最大人距离事件作为它的窥视,但是我发现这不会一直发生。我在循环中使用pq.poll()打印了这个队列的结果,我发现队列在删除后没有重新排列,只是有时。 我的比较者: 以主方法打印: 输出: 如您所见,事件不是按降序排列的!然而,