Objekt in vector verschieben..
-
Hallo,
ich habe schon die Forensuche verwendet aber nichts entsprechendes gefunden.
Ich gehe durch meinen vector container und möchte das momentan bearbeitete Objekt vor das vorherige verschieben. Leider klappt meiner Vorgehensweise nicht.
Hier mal ein Codebeispiel wie ich es momentan versuche:
for (IndicesList::iterator i = list->begin(); i != list->end(); ++i) { if(x) { int ti = *i; i = list->erase(i); i = list->insert(i,ti); } }Für eine Lösung bzw. Info was ich falsch mache wäre ich dankbar.
Gruss
Sam
-
if(x) {was ist x?
ja und so wie es aussieht, ersetzt du, und verschiebst nicht.
-
erase liefert einen Iterator auf das nächste Element nach dem Gelöschten. Vor diesem fügst du wieder ein, es passiert also im Grunde gar nichts. Sinnvoller dürfte aber in diesem Falle wohl swap oder splice sein.
-
Hallo,
danke erstmal. x ist einfach irgendeine Kondition. Ist aber auch erstmal irrelevant. Ich habe schon jede Kombination ausprobiert, aber ich krieg immer ne exception.
Der Container beinhaltet 2 elemente (können natürlich auch mehr sein, aber der Simplizitäts halber mal nur 2) und es wird beim 2 Element ersetzt, sprich der Iterator i zeigt aufs 2. Element im Container. Dieses soll nun vor das erste gesetzt werden und das bestehende Element gelöscht:
Vor der Operation sieht der Container folgendermaßen aus:
[0,1]Das Ergebnis soll [1,0] sein.
int ti = *i; //ti = 1 i = list->insert(i-1,ti); //container ist nun [1,0,1] //der zurückgegebene Iterator i zeigt nun auf das erste Element im Container i = list->erase(i+2); //Lösche das 3 ElementDas Problem hierbei ist nun, dass der zurückgegebene Iterator i nun das Element nach dem gelöschten widergibt. Das gibts aber logischerweise nicht.
Wie kann ich dieses Problem also lösen? Kann ich einfach
i = list->erase(i+2)-1;schreiben?
Danke
Wie sollte es denn richtig gehen?
-
camper schrieb:
erase liefert einen Iterator auf das nächste Element nach dem Gelöschten. Vor diesem fügst du wieder ein, es passiert also im Grunde gar nichts. Sinnvoller dürfte aber in diesem Falle wohl swap oder splice sein.
Splice gibts leider nur für den list container. Der ist aber ungünstig weil ich viel Random access habe und Performance ein Thema ist.
Swap, dafür bräuchte ich wieder einen 2. container, das ist aber auch nicht gerade sinnvoll, da das Alloziieren wieder Zeit kostet und der Speicherverbrauch ja dann auch steigt. Oder sehe ich das falsch? Der Container kann theoretisch mit endlich vielen Elementen besetzt sein und swap scheint nur den kompleten Kontainer zu swappen. Das ist leider nicht akzeptabel.
Eine lokale Lösung im Container selber wäre also die bevorzugte Lösung. Das kann doch nicht so schwer sein, ein Element mit dem vorherigen zu ersetzen oder?
Anybody a clue?

-
Ich habe splice nur genannt, da nicht zu entnehmen war, welchen Container du einsetzt.
for (IndicesList::iterator i = list->begin()+1; i != list->end(); ++i) { using std::swap; if(x) swap(i[-1],i[0]); }keine Umstände.
-
camper schrieb:
Ich habe splice nur genannt, da nicht zu entnehmen war, welchen Container du einsetzt.
for (IndicesList::iterator i = list->begin()+1; i != list->end(); ++i) { using std::swap; if(x) swap(i[-1],i[0]); }keine Umstände.
Danke erstmal. Sorry, mein Fehler. Hätte ich wohl erwähnen sollen! Wenn ich das Beispiel so übernehme, dann krieg ich trotzdem ne Exception. Hmm, moment ich muss mal debuggen um zu schauen, was genau passiert.
-
hmm, der Swap scheint eigentlich einwandfrei zu funktionieren und jetzt crashts auch nicht mehr. Keine Ahnung warums beim ersten Aufruf gecrasht ist. Cool!

Scheint funktioniert zu haben. Vielen Dank also!
-
* Ist wohl doch schon spät geworden *
-
lol
