【发布时间】:2016-02-20 06:29:32
【问题描述】:
我想知道如何将此二进制堆代码转换为使用对象向量而不是整数向量。
假设创建的向量是<strong>vector <int> 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<定义为节点的成员并使用它可能是最简单的。将less函子传递到堆的构造中更为通用,但也更难(几乎没有好处),我认为您现在应该跳过它。 -
我会关注这个tutorialspoint.com/cplusplus/cpp_templates.htm,希望我能让它工作,谢谢你的帮助
-
我注意到您将元素与
elements[left] > elements[index]进行比较,我建议您将其更改为elements[index] < elements[left]。你可以在你的节点类中定义operator>,但是遵循一般约定有相当多的价值,比较任意对象的约定是更喜欢<