std::vector<T>::reverse_iterator und erase
-
Hi.
Ich suche derzeit nach einer Lösung für folgendes Problem:for (vector<CWindow*>::reverse_iterator it = this->m_Order.rbegin(); it != this->m_Order.rend(); ) { if ((*it)->IsDeleteFlagSet()) { // geht nicht it = this->m_Order.erase(it); continue; } it++; }So etwas wie
reraseodererasergibt es leider auch nicht.
-
Das einfachste wäre es, den vector umzudrehen. Was besseres fällt mir auf die schnelle auch nicht ein
std::vector<CWindow*> tmp(m_Order.rbegin(), m_Order.rend()); /*... löschen ...*/ m_Order.assign(tmp.rbegin(), tmp.rend());btw: this UND m_ ist ein wenig übertrieben - meinst du nicht auch?
bb
-
Ich kann den Vektor nicht umdrehen. Wenn dann müsste ich ihn jedesmal kopieren und dann umdrehen (>100x in der Sekunde).
Dann werde ich mein System wohl umstellen müssen.
btw: this UND m_ ist ein wenig übertrieben - meinst du nicht auch?
Nein.
Gruß
-
theliquidwave schrieb:
Ich kann den Vektor nicht umdrehen. Wenn dann müsste ich ihn jedesmal kopieren und dann umdrehen (>100x in der Sekunde).
100x in der Sekunde nen paar Zeiger umkopieren sollte machbar sein.
Das einzige "Problem" sollte das new sein.Dann werde ich mein System wohl umstellen müssen.
naja - es klingt so, als ob du danach all die Objekte löschen würdest.
dann könntest du dir auch ein remove_if bauen, was die objekte erst nach hinten verschiebt und die letzten x elemente dann bearbeiten und dann löschen.bb
-
std::reverse_iteratorhat eine Memberfunktionbase(). Doku lesen!Ausserdem hat dein momentaner Algorithmus quadratische Zeitkomplexität. Ich empfehle eine Umstellung auf
std::remove_if()kombiniert mit dererase()-Überladung für eine Iterator-Range, damit kannst du lineare erreichen.