Ich habe ein Programm geschrieben, um die durchschnittliche Pfadlänge in meinem rot-schwarzen Baum zu berechnen. Ich habe etwas wirklich komisches gefunden. Der Code ist unten dargestellt:Warum zeigen lokale Variablen, die von Zeigern und Objekten erzeugt werden, unterschiedliche Ausgaben an?
while (dataSize<MaxSize) {
int i = 0;
double aveLengthArr[1000];
while (i < 1000) {
RedBlackTree rbt;
int* array= generateRandomInput(dataSize);
for (int n= 0; n < dataSize; n++) {
rbt->insert(array[n]);
}
aveLengthArr[i]=rbt->getAvePathLength();
i++;
}
double mean = calAverage(aveLengthArr);
double stdDeviation = calDeviation(aveLengthArr, mean);
dataSize++;
}
Wenn ein bestimmte Zeile Code RedBlackTree rbt;
verwendet wird, die durchschnittliche Länge ist immer noch das gleiche mit unterschiedlichem Eingang array
(ich habe es schon ausgetestet). Aber wenn der Code zu RedBlackTree* rbt=new RedBlackTree;
geändert wird, erhält es das richtige Ergebnis und die Länge variiert.
So bin ich wirklich verwirrt, weil rbt
eine lokale Variable ist, oder? Jedes Mal, wenn das Programm in eine neue Schleife springt, sollte die rbt
ein völlig neues Objekt sein. Selbst wenn es nicht aktualisiert wird, sollte die Länge zunehmen, ist es aber nicht. Nach dem Verwenden eines Zeigers ist es richtig.
Eine andere seltsame Sache ist, dass, wenn ich das Programm mit Code RedBlackTree rbt;
in Window7 ausführen, das Ergebnis richtig ist. Bei Verwendung von Ubuntu zeigt es das obige Problem. Irgendeine Idee wird geschätzt. Es ist wirklich schwer für mich, es herauszufinden.
Die RedBlackTree ist rot schwarz Baum und ich schreibe es als selbstdefinierte class.Part der Klasse wird unten gezeigt:
class RedBlackTree {
private:
Node* root;
int redNodeNum;
int totalPathLength;
public:
RedBlackTree() {
redNodeNum = 0;
totalPathLength = 0;
}
}
'RedBlackTree rbt; rbt-> insert (array [n]); '? Was ist denn hier los? Ist 'RedBlackTree' eine Art intelligenter Zeiger? –
@Sergey Tachenov @Sergey Tachenov @Sergey Tachenov @Sergey Tachenov @HostileFork gibt mir eine gute Erklärung, aber ich möchte immer noch herausfinden, warum 'RedBlackTree * rbt = new RedBlackTree' funktioniert, ohne root zu initialisieren. –