我已经尝试在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()它没有返回正确的节点。
我的精神调试能力告诉我,因为您没有为您的Node
实现复制构造函数,所以您不小心在某个地方复制了它,导致了双重删除。
我刚开始学习C语言,有一半的时间我不知道自己在做什么,花了好几个小时在谷歌上搜索,盲目地在我的项目中输入代码,这可能是一个基本的问题,但我似乎不能正确地理解它。 这是我作业的要求,我需要这些: 在“边”类中: 在Graph类中: 我在声明优先级队列时遇到问题。细节: 如果我直接使用这些,edge类会给我一个错误“必须有类的参数”,我知道我不能将两个指针重载到bool运算符中,所以我尝试了以下方法:
我正在进行数据结构考试,我正在准备一系列复习题。我的问题如下: “假设你的朋友来找你,声称他发明了一个超快速的基于优先级的比较队列。优先级队列的速度如下(n 是当前在优先级队列中的项目数):a. 在 O(sqrt(logn))时间插入新项目 b. 在 O(sqrt(logn)) 时间从队列中提取(删除并返回)最小项目。 解释为什么你的朋友一定在撒谎: 据我所知,标准优先级队列的运行时间是用于提取的
我所拥有的是一个类,它创建了一个具有优先级、到达时间和完成时间的对象。我还有许多优先级队列可以将它们放入其中。当我开始时,我将它们放入到达队列中,对它们进行排序,然后查看哪个第一个进入,并将其放入队列中。但是,当我尝试向到达队列添加第二个队列时,它会失败并抛出一个异常。我首先要做的是将所有进程添加到到达队列中,然后对它们进行排序,这样到达时间最短的进程将是到达队列中第一个进入队列的进程。谢谢你帮忙
我正在实现一个应用程序,该应用程序根据曼哈顿距离查找(x,y)平面中给定位置的最近n个事件。我使用最大优先级队列来存储找到的事件,并使用曼哈顿距离比较器。这个队列应该总是有最大人距离事件作为它的窥视,但是我发现这不会一直发生。我在循环中使用pq.poll()打印了这个队列的结果,我发现队列在删除后没有重新排列,只是有时。 我的比较者: 以主方法打印: 输出: 如您所见,事件不是按降序排列的!然而,