sort mit Klassen
-
Wie kann ich bewirken, dass sort beim sortieren eines vectors von Objekten meiner Klasse A den operator</> meiner Klasse benutzt? Und ergibt der Aufruf keinen Fehler, wenn ich keinen definiere? Wie wird dann sortiert?
-
Es wird automatisch kleiner verwendet. Wenn nicht vorhanden, gibt es einen entsprechenden Fehler.
Wenn Du Deinen Vektor mit vector<A*> anlegst, ist ein kleiner automatisch für den Pointer definiert und er sortiert danach. Ansonsten gibt es einen Compile-Fehler.
-
__gast schrieb:
Wie kann ich bewirken, dass sort beim sortieren eines vectors von Objekten meiner Klasse A den operator</> meiner Klasse benutzt?
den operator überladen
bsp: http://tutorial.schornboeck.net/operatoren_ueberladung.htm__gast schrieb:
Und ergibt der Aufruf keinen Fehler, wenn ich keinen definiere?
ja
__gast schrieb:
Wie wird dann sortiert?
-
Vielen Dank für die Antworten.
Ja, ich arbeite mit Pointern. Ich habebool operator<(MyClass& a,MyClass& b) { return true; } bool operator>(MyClass& a,MyClass& b) { return true; }implementiert.
Trotzdem gibt es bei Benutzung von sort einen Fehler in _function_base.htemplate <class _Tp> struct less : public binary_function<_Tp,_Tp,bool> { bool operator()(const _Tp& __x, const _Tp& __y) const { return __x < __y; } };[C++ Error] _function_base.h(73): E2093 'operator<' not implemented in type 'MyClass' for arguments of the same typeWieso das?
-
class CompAPointer { public: bool operator()(const A* a,const A* b) const { return true; } } int main() { vector<A*> x; sort( x.begin(), x.end(), CompAPointer()); }Wenn Du vector<A*> benutzt, wird niemals A::operator< aufgerufen, sondern A*::operator <, was nur die Pointer vergleicht.
Deswegen übergibst Du sort dann ein Objekt, welches den Vergleich erledigt (auf Pointer Basis).
-
Muss dass eine Klasse sein?
-
Nein:
bool CompareAPtr(const A* a,const A* b) { return true; } int main() { vector<A*> x; sort( x.begin(), x.end(), ptr_fun( CompareAPtr)); }
-
bool operator<(MyClass& a,MyClass& b)
{
return true;
}
// Sollte doch einfach so aussehen
bool operator< (const MyClass& a, const MyClass& b)
{
return true;
}Dann sollte das auch ganz ohne Prädikat (diese Vergleichsklasse hier) gehen, gibt ja nicht umsonst vorgefertigte wie std::less
MfG SideWinder
-
Wobei man vielleicht noch anmerken sollte, dass die Sortierfunktion "Strict Weak Ordering" erfüllen muss:
http://www.sgi.com/tech/stl/StrictWeakOrdering.htmlKurzform:
f(x, x) -> false.
f(x, y) -> !f(y, x)
f(x, y) und f(y, z) -> f(x, z)Insbesondere wichtig, wenn man so ein Prädikat in Maps oder Sets einsetzt. Sonst sind die potenziell intern Schrott.
-
@SideWinder
Der OP arbeitet wohl mit einem Vektor von Pointern, deswegen funktionieren seine operator< als Sortierkriterium nicht.
Im Fall von vector<A> benötigt er natürlich keine extra Vergleichsfunktion.
-
Aber selbst für Pointer reicht ein eigener op< für Pointer + std::less?
MfG SideWinder
-
Vielen Dank, die Methode von niemand mit der Funktion gefällt mir am besten. Funktioniert einwandfrei...
-
@SideWinder:
Du meinstclass A { }; int main() { vector<A*> x; sort( x.begin(), x.end()); }?
In dem Fall wird less<A*>() aufgerufen, d.h. in etwa eine so aussehende Funktion:bool less<A*>( const A* a, const A* b) { return a < b; }d.h. es wird nicht A::operator<() aufgerufen.
Obiges Beispiel compiliert, während die Variante mit vector<A> aufgrund des fehlenden A::operator< nicht compiliert.