void Heap::printHeap(string file) {
string heapString = "graph {\n";
for (int i = 1; i < heapSize; i++) {
Node parentNode = heap[i];
heapString += parentNode.nodeToDotFormat() + "\n";
int leftChildIndex = 2 * i;
int rightChildIndex = 2 * i + 1;
if (leftChildIndex < heapSize) {
heapString += parentNode.nodeToDotFormat();
heapString += "--";
Node leftChild = heap[leftChildIndex];
heapString += leftChild.nodeToDotFormat();
heapString += "\n";
if (rightChildIndex < heapSize) {
heapString += parentNode.nodeToDotFormat();
heapString += "--";
Node rightChild = heap[rightChildIndex];
heapString += rightChild.nodeToDotFormat();
heapString += "\n";
}
}
}
heapString += "}";
ofstream out(file);
out << heapString;
out.close();
}
我试图打印我的堆。并且堆由具有指针的节点结构组成。出于某种原因,虽然当ofstream
在代码下方执行时,它会弄乱我的堆积指针。可能是什么导致了这个?我将如何解决它。
这是执行ofstream
行之前的几点:
正如你所看到的,它改变了左子信和体重,以及正确的子信重量。为什么你认为ofstream导致这种行为?
这是Node结构:
struct Node {
char letter;
int weight;
string nodeInString() {
string nodeString = "{'";
char copyletter = letter;
nodeString.append(©letter);
nodeString += "', ";
nodeString += to_string(weight);
nodeString += "}";
return nodeString;
};
string nodeToDotFormat() {
string dotString = "";
char copyletter = letter;
dotString.append(©letter);
dotString += "_";
dotString += to_string(weight);
return dotString;
}
Node *leftChild;
Node *rightChild;
};
答案 0 :(得分:3)
以下复制初始化会引起一些怀疑
Node parentNode = heap[i];
...
Node leftChild = heap[leftChildIndex];
...
Node rightChild = heap[rightChildIndex];
您似乎将Node
数组中的 heap
对象复制到本地变量。如果您忘记遵循类{3}的三阶规则(或五阶规则)或者错误地实现了相应的函数,那么上述本地对象的析构函数也可能会损坏或破坏{}中的原始对象。 {1}}数组。
但是如果没有看到你的析构,很难说。显示Node
及其成员函数的定义。
当然,一个很大的问题是为什么你将这些节点复制到局部变量中?似乎heap
函数不需要修改原始节点数据。因此,不需要引入副本。