我想知道如何转换此二进制堆代码以使用对象向量而不是整数向量。
假设创建的向量是vector
<int>
elements;
BinHeap
<int>
节点类
void BinHeap::maxHeapify(unsigned int index)
{
unsigned int left, right, maxx;
left = 2*index;
right = 2*index + 1;
// Base case
if (index == 0)
return;
// Check the children, if they exist and pick the larger for swapping
if (left < elements.size() && elements[left] > elements[index])
maxx = left;
else
maxx = index;
if (right < elements.size() && elements[right] > elements[maxx])
maxx = right;
if (maxx != index)
{
int temp = elements[maxx];
elements[maxx] = elements[index];
elements[index] = temp;
maxHeapify(maxx);
}
// Now check the parent, if it exists
maxHeapify(index/2);
}
非常感谢任何帮助
答案 0 :(得分:0)
部分答案(因为代码很难放入评论中):
class Node
{
...
bool operator<( Node const& r ) const
{
return guestID < r.guestID;
}
...
};
这使得粗略猜测您希望完全基于Node的单个成员进行比较Node
。在更可能的情况下,您希望将其基于优先级成员序列,请使用std::tie
,如下所示:
Implementing comparison operators via 'tuple' and 'tie', a good idea?
请注意,链接显示的operator<
不是要比较的类的成员,而我展示了(通常更方便)成员的形式。但这应该不会改变std :: tie的使用方式。
在operator<
的成员形式中,左手操作数是隐式传递的*this
,因此简单命名的成员来自左侧,而命名参数(r
位于我的示例代码中)是右手操作数。
有效的“小于”关系有很多规则,operator<
应该实现。没有C ++规则需要operator<
来实现这一点,但是如果你没有有效的“小于”关系,许多可能的用途(包括你的堆)将是不健全的。如果您要在比较两个节点时检查多个成员,那么对于初学者来说,这是非常常见的(几乎是通用的),以便错误地并且意外地定义无效的“小于”。但是,如果让std::tie
管理优先级的子比较列表,则可以轻松地将每个成员的operator<
中的有效关系用于整体比较中的自动有效关系。
答案 1 :(得分:0)
找到我的答案,我觉得太复杂了,我所要做的就是使用.getID()函数并添加一个默认构造函数来修复另一个问题