【问题标题】:Converting Code to work with vectors将代码转换为使用向量
【发布时间】:2016-02-20 06:29:32
【问题描述】:

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

假设创建的向量是<strong>vector &lt;int&gt; elements;

垃圾堆

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);
 }

节点类

class Node
{
    private:
        int     guestID;
        string  name;
        string  surname;
        string  season;
        int     year;
        int     nights;
        string  payMethod;
        string  purpose;
        string  membership;
        Node*   nextPtr;

    public:
            // Constructor function
        Node(int, string, string, string,int, int, string, string, string);

            //Accessor functions
        int     getID()         { return guestID; }
        string  getName()       { return name; }
        string  getSurname()    { return surname; }
        string  getSeason()     { return season; }
        int     getYear()       { return year; }
        int     getNights()     { return nights; }
        string  getpayMethod()  { return payMethod; }
        string  getPurpose()    { return purpose; }
        string  getMembership() { return membership; }
        Node*   getNext()       { return nextPtr; }
        string  getData();

            //Mutator functions
        void setID(int num)              { guestID = num; }
        void setName(string str)         { name = str; }
        void setSurname(string str)      { surname = str; }
        void setSeason(string str)       { season = str; }
        void setYear(int yr)             { year = yr; }
        void setNights(int totNights)    { nights = totNights; }
        void setpayMethod(string payment){ payMethod = payment; }
        void setPurpose(string str)      { purpose = str; }
        void setMembership(string str)   { membership = str; }

        void setNext(Node* ptr){nextPtr = ptr;}
};

任何帮助将不胜感激

【问题讨论】:

  • 我希望这个练习的重点是了解模板。这是学习模板的一个很好的练习。但假设它是,不要要求别人为你做这件事。尝试将您的 BinHeap 从普通类更改为模板类,并将int 的相关用途更改为模板参数。如果您遇到困难,请发布您尝试过的内容并提出更具体的问题。
  • 这不是关于学习模板。在另一个函数中,我让节点向量工作,但因为向量是 而不是 我无法修改 maxHeapify。
  • 可以编写仅支持 node 类型元素的 BinHeap 版本,就像您当前拥有仅支持 int 类型元素的 BinHeap 版本一样.借此机会使用一些模板会更好。无论哪种方式,您首先需要一个比较运算符。将典型的operator&lt; 定义为节点的成员并使用它可能是最简单的。将less 函子传递到堆的构造中更为通用,但也更难(几乎没有好处),我认为您现在应该跳过它。
  • 我会关注这个tutorialspoint.com/cplusplus/cpp_templates.htm,希望我能让它工作,谢谢你的帮助
  • 我注意到您将元素与elements[left] &gt; elements[index] 进行比较,我建议您将其更改为elements[index] &lt; elements[left]。你可以在你的节点类中定义operator&gt;,但是遵循一般约定有相当多的价值,比较任意对象的约定是更喜欢&lt;

标签: c++ object vector nodes


【解决方案1】:

部分答案(因为代码很难放入 cmets):

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&lt;,它不是被比较的类的成员,而我展示了(通常更方便的)成员的形式。但这不应该改变 std::tie 的使用方式。

operator&lt; 的成员形式中,左侧操作数是隐式传递的*this,因此简单命名的成员从左侧开始,而命名参数(在我的示例代码中为r)是右侧操作数.

对于有效的“小于”关系有很多规则,operator&lt;应该实现这些规则。没有 C++ 规则需要 operator&lt; 来实现这一点,但如果您没有有效的“小于”关系,许多可能的用途(包括您的堆)将是不合理的。如果您将在比较两个节点时检查多个成员,那么初学者很常见(几乎普遍)会出错并意外定义无效的“小于”。但是,如果您让std::tie 管理子比较的优先列表,您可以轻松地将每个成员的operator&lt; 中的有效关系转化为整体比较中的自动有效关系。

【讨论】:

  • 如果我错了,请纠正我,此代码接受一个节点,并将前一个 guestID 与正在传入的节点的 guestID 进行比较,并在前一个 guestID 小于当前的时返回 true?
  • 此代码接受 两个 const Nodes,(不是“一个节点”)。与其他成员函数一样,一个Node(恰好是使用&lt; 的左侧操作数)被隐式采用,并且不会显示在操作数列表中。操作数列表中显示的一个节点是与实际 &lt; 一起使用的两个节点之一。
【解决方案2】:

找到我的答案,我想得太复杂了,我所要做的就是使用 .getID() 函数并添加一个默认构造函数来解决另一个问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-08
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多