Problem mit Vektor* bzw. Datenstruktur fehlerhaft.
-
Einen schönen guten Tag,
folgendes Problem beschäftigt mich nun schon eine Weile, vielleicht hat ja jemand die Muße mir zu helfen. Leider kann ich meiner Meinung nach, den "Code-Schnipsel" nicht weiter reduzieren..
Diese kleine Datenstruktur ist zwar lauffähig, macht aber leider nicht das, was sie soll.
Es sollen lediglich die Daten (s. Bspl.) gespeichert werden, und wenn ein Datensatz die gleichen x-/y-Werte hat (hier reicht eine Überprüfung des y-Wertes ind, soll die Variable Anzahl um eins erhöht werden. Leider funktioniert die Schleife im Konstruktor von COuterMatrixData (Zeile: 34 f.) nicht. An dieser Stelle soll eigentlich geschaut werden, ob der übergebene Datensatz bereits in dem Vector m_InnerData vorhanden ist, und wenn ja - soll die Variable Anzahl um eins erhöht werden.. Dafür überprüfe ich den x-Wert und anschließend in der Schleife jeden y-Wert im Vektor m_InnerData.
Beispiel:
Folgende Ausgabe liefert das Programm zur Zeit:
3, 7, 1 45, 99, 1 19, 1, 1 3, 7, 1Es sollte jedoch folgende Ausgabe liefern:
3, 7, 2 45, 99, 1 19, 1, 1Hier der Quellcode:
#include <iostream> #include <vector> using namespace std; class CInnerMatrixData { private: long m_Y; long m_Anzahl; public: CInnerMatrixData() {} ~CInnerMatrixData() {} CInnerMatrixData(long y, long anzahl) { m_Anzahl = anzahl; m_Y = y; } void setAnzahl(long a) { m_Anzahl = a; } void setY(long y) { m_Y = y; } long getAnzahl() { return m_Anzahl; } long getY() { return m_Y; } }; class COuterMatrixData { private: long m_X; public: COuterMatrixData() {} ~COuterMatrixData() {} COuterMatrixData(long x, long y, long anzahl) { // Tempvariable, um zu merken, ob ein Datensatz in CInnerMatrixData bereits existiert. int temp = 0; // Voraussetzung: Gleicher x-Wert. if(this->getX() == x) { // Abbruchbedingung: Wenn Objekt mit gleichem y-Wert gefunden wurde und temp = 1 ist, bzw. wenn der Vektor am Ende angelangt ist. for(vector<CInnerMatrixData*>::iterator it = this->m_InnerData.begin(); temp != 1 && it != this->m_InnerData.end(); it++) { if(this->m_InnerData.empty()) { // Wenn ein CInnerMatrixData Objekt mit gleichem y-Wert gefunden wurde, soll 'Anzahl' um eins inkrementiert werden. if((*it)->getY() == y) { (*it)->setAnzahl((*it)->getAnzahl() + 1); // Objekt mit passendem y-Wert wurde gefunden und berarbeitet, demnach gleich nicht mehr neu anlegen! temp = 1; } } } } // Nur durchführen, wenn kein passendes Onjekt gefunden wurde. if(temp == 0) { m_X = x; m_InnerData.push_back(new CInnerMatrixData(y, anzahl)); } } long getX() { return m_X; } vector<CInnerMatrixData*> m_InnerData; }; int main() { vector<COuterMatrixData> matrix; matrix.push_back(COuterMatrixData(3, 7, 1)); matrix.push_back(COuterMatrixData(45, 99, 1)); matrix.push_back(COuterMatrixData(19, 1, 1)); // An dieser Stelle soll der Datensatz gefunden werden und die Anzahl um eins erhöht werden (Siehe Konstruktor in Zeile 34 f.). matrix.push_back(COuterMatrixData(3, 7, 1)); for(vector<COuterMatrixData>::iterator it = matrix.begin(); it != matrix.end(); it++) { cout << it->getX() << " "; for(vector<CInnerMatrixData*>::iterator innerIt = it->m_InnerData.begin(); innerIt != it->m_InnerData.end(); innerIt++) { cout << (*innerIt)->getY() << " " << (*innerIt)->getAnzahl() << endl; } } return 0; }Woran kann das liegen?
Viele Dank und einen schönen Gruß,
Christian
-
Jede OuterMatrix hat einen eigenen vector m_innerData, der im Konstruktor leer initialisiert wird. Und in diesem leeren vector kannst du auch nichts finden, also wird der neue Wert dort eingetragen.
Und die Variable matrix ist ein blanker vector, die prüft auch nicht, ob du Duplikate einträgst.PS: DEin Code sieht übrigens grauenhaft aus

-
Gut, ich denke der Hinweis reicht mir aus. Habe das Problem erkannt.. Danke.
Was genau meinst Du mit Grauenhaft? Hättest Du verbesserungsvorschläge?
Kritik interessiert mich
Gruß,
Christian