Frage zur Programmlogik (sort)
-
Hallo, kurze Frage zur richtigen Verwendung von sort (aus <algorithm> ). Ich habe einen std::vector mit objekten, die jeweils eine eigenschaft namens id haben. Das ist ein unsigned int, das die werte 1 bis 9 annehmen kann. Jetzt soll der vector so sortiert werden, dass am anfang alle objekte stehen, deren id 3 oder 8 ist. Danach sollen alle anderen ids kommen. Wie genau sortiert wird ist egal. Mein Ansatz ist folgender
bool sort_pred(const foo& bar1, const foo& bar2) { //beide objekte haben id 3 oder 8 if( (bar1.id==3 || bar1.id==8) && (bar2.id==3 || bar2.id==8) ) return false; //nur das rechte objekt hat id 3 oder 8 if( (bar1.id!=3 && bar1.id!=8) && (bar2.id==3 || bar2.id==8) ) return false; //nur das linke objekt hat id 3 oder 8 if( (bar1.id==3 || bar1.id==8) && (bar2.id!=3 && bar2.id!=8) ) return true; //kein objekt hat id 3 oder 8 return false; } sort(vec.begin(), vec.end(), sort_pred);Stimmt das so? Kann es im Moment nicht testen. Gibt es vielleicht eine einfachere/bessere Lösung für dieses Problem?
Schonmal Danke für alle Ideen!
-
Stimmt so.
-
viel einfacher:
bool sort_pred(const foo& bar1, const foo& bar2) { if( (bar1.id==3 || bar1.id==8) ) return true; if( (bar2.id==3 || bar2.id==8) ) return false; return false; }da es ja egal ist, wie genau sortiert wird, sollte das auch gehen...
falls du kommutativität brauchst, geht auch dein code nicht... müsstest du nur das letzte false durch bar1.id < bar2.id ersetzen...bb
-
Mein Vorschlag:
int func38( int i ) { switch( i ) { case 3: case 8: return 0; } return 1; } bool sort_pred( const foo& bar1, const foo& bar2 ) { return func38( bar1.id ) < func38( bar2.id ); }Die Variante von unskilled könnte auch in einer Endlos-Schleife enden, abhängig von der Implementierung des sort-Algorithmus. Z.B. wenn alle ids 3 oder 8 sind und intern BubbleSort verwendet wird (i.A. wenn die Anzahl der Elemente sehr klein ist).
Lt. Standard müssen die Elemente 'strict weak ordered' sein:For the algorithms to work correctly,
comp has to induce a strict weak ordering on the values.Das erfüllt die Variante nicht.
Gruß
Werner