Vector mit Zeigern auf Objekte sortieren..
-
Hallo,
ich habe einen Vector, welcher mit Objekten befüllt wird
vector<Datum*> *_vd = new vector<Datum*>; _vd->push_back(new Datum(2030, 1, 1)); _vd->push_back(new Datum(2011, 12, 12)); _vd->push_back(new Datum(2011, 12, 13)); _vd->push_back(new Datum(2011, 12, 14)); _vd->push_back(new Datum(2010, 12, 18));Diesen Vector möchte ich sortieren, dafür habe ich den Operator< überladen
bool operator<(const Datum &orig)const{ cout << "operatornutzung!!" << endl ; if(orig._year>this->_year)return true; if(this->_year>orig._year)return false; if(orig._month>this->_month)return true; if(this->_month>orig._month)return false; if(orig._day>this->_day)return true; if(this->_day>orig._day)return false; else return false; }nun möchte ich den Vector Sortieren
sort(*(_vd)->begin(), *(_vd)->end());er ruft den überladenen Operator dann tausendfach auf und hängt sich auf..
was mache ich verkehrt.
(wird der Vector mit objekten ohne new befüllt, funktioniert das Sortieren mit
sort(_v.begin(), _v.end());tadellos..
vllt. hat ja jemand eine Idee..

-
Du musst eine Sortierfunktion für die Zeiger schreiben und diese als drittes Argument an sort übergeben. Wie das mit dem dritten Argument für sort funktioniert, sollte in jeder guten Referenz auf gleich mehrere Arten vorgemacht werden.
Warum speicherst du überhaupt Zeiger auf Datum, anstatt direkt ein Datum? Und Zeiger auf einen Vektor?
Das macht ja mal gar keinen Sinn!
Ich glaube, das Problem ist viel eher, dass du gerade Java in C++ machst. In C++ brauchst du so gut wie nie ein explizites new. Lass all die Zeiger weg und all die new, dann löst sich dein Problem ganz von alleine. Zudem wird dein Programm automatisch schneller und weniger fehleranfällig (da du derzeit mit rohen Zeigern hantierst, kann es gar nicht korrekt sein, wenn man Exceptions beachtet). Da dies eine wesentlich bessere Lösung ist als den sort-Aufruf zu korrigieren (der würde dadurch auch automatisch korrekt, ohne dass du ein drittes Argument brauchst), mache ich das geänderte sort bewusst nicht vor.
-
Dany303 schrieb:
sort(*(_vd)->begin(), *(_vd)->end());Die Sternchen gehören dort nicht hin. sort vergleicht Objekte vom Typ Datum *, nicht Datum. Daher kann dein Operator so nicht angewendet werden. Richtiger wäre sowas hier:
sort(begin(*_vd), end(*_vd), [](const Datum *lhs, const Datum *rhs){ return *lhs < *rhs; });Dein Vergleich geht auch schöner:
bool operator < (const Datum &lhs, const Datum &rhs) const{ cout << "operatornutzung!!" << '\n'; return std::tie(lhs._year, lhs._month, lhs._day) < std::tie(rhs._year, rhs._month, rhs._day); }Und was Sepp gesagt hat (sorry fürs vormachen): Wenn dein Code das Keyword new enthält dann ist er falsch. Es gibt da ein paar Ausnahmen, aber die sind erstmal nicht wichtig.
-
okay.
tie :o
Danke für die schnelle Antwort :->