转换代码以使用向量

时间:2015-11-18 13:32:20

标签: c++ object vector nodes

我想知道如何转换此二进制堆代码以使用对象向量而不是整数向量。

假设创建的向量是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);
 }

非常感谢任何帮助

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()函数并添加一个默认构造函数来修复另一个问题