PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Elemente einer Liste vertauschen?



STEVMASTER
27-03-2005, 22:59
Was ist die einfachste Möglichkeiten, zwei Elemente einer Liste der STL (aus list.h) zu vertauschen??
In der Referenz sehe ich keine Methode, die eine solche Funktion zur Verfügung stellt..
Muss ich immer die neuen Elemente einsetzen und dann die alten entfernen, oder geht das vertauschen zweier Elemente auch unkomplizierter?

SeeksTheMoon
28-03-2005, 09:24
Es gibt keine Methode dafür, das musst Du also per Hand machen:
Du kannst die Liste durchiterieren bis Du das erste und zweite Tausch-Element gefunden hast (sofern Du die Indizes nicht kennst), sicherst sie und dann musst Du die Elemente aus der Liste löschen und vertauscht wieder einsetzen.
Je nach Art des Elements kannst Du es anstatt zu löschen auch überschreiben.

Das Vertauschen von zwei Elementen läuft in der Regel so ab:
Wenn also a,b Elemente der Liste sind, dann erstellst Du eine temporäre Variable c vom gleichen Typ und dann geht es wie folgt:

c = a //a sichern
a = b //b auf a kopieren
b = c //das in c stehende a auf b kopieren

STEVMASTER
28-03-2005, 10:55
Thx, so hab' ich's mir auch gedacht...

ContainerDriver
28-03-2005, 16:15
Vertauschen kann man auch so (habe ich mal irgendwo gelesen):


a^=b;
b^=a;
a^=b;

.
Dann spart man sich eine dritte Variable (weiß allerdings nicht ob diese Operationen schneller sind als das bloße kopieren von a nach b (z.B.)).

Gruß, FLorian

EDIT: Das geht leider nur für Variablen vom Typ int oder durch Überladen des ^=-Operators (vgl. unten).

cyk
29-03-2005, 14:21
Vertauschen kann man auch so (habe ich mal irgendwo gelesen):


a^=b;
b^=a;
a^=b;



Das funktioniert im Gegensatz zu der Lösung mit der temp. Variablen aber nicht mit allen Datentypen...

ContainerDriver
29-03-2005, 18:51
Das funktioniert im Gegensatz zu der Lösung mit der temp. Variablen aber nicht mit allen Datentypen...
Zum Beispiel?

Joghurt
30-03-2005, 13:51
Zum Beispiel mit allem, was kein Integer ist.
^ ist XOR!

Der Code ist mehr Spielerei, um zu zeigen, wie leet man ist, (so ähnlich wie return'^'^'^') wirklich praktische Bedeutung hat er nicht.

locus vivendi
30-03-2005, 14:42
[ Bei welchen Typen funktioniert der "Trick" ? ]

Zum Beispiel mit allem, was kein Integer ist.
Ganz so einfach ist es dann doch nicht. Es reicht aus das ein Typ den ^= Operator geeignet überlädt, damit es geht.

ContainerDriver
30-03-2005, 15:28
Oha, da habe ich mal wieder Mist erzählt. Danke für die Aufklärung!

Gruß, Florian

Joghurt
30-03-2005, 15:55
Ganz so einfach ist es dann doch nicht. Es reicht aus das ein Typ den ^= Operator geeignet überlädt, damit es geht.Natürlich! Aber nenne mir mal eine Klasse, die den ^= als XOR-Operator implementiert.

Und selbst wenn es eine gibt, dann wäre das dann wieder langsamer als die Elemente normal zu vertauschen.

locus vivendi
30-03-2005, 16:49
Natürlich! [ ... ]
Naja, ich gebe zu, im Grunde war mein Hinweis trivial. Andererseits weiß man auch nicht wer alles mitliest, und für den einen oder anderen mag das tatsächlich nicht so klar sein.

panzi
30-03-2005, 17:33
Vieleicht ist std::iter_swap() für std::list speziallisiert? Müsste man nachschaun.