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 rerase oder eraser gibt 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_iterator hat eine Memberfunktion base() . Doku lesen!

    Ausserdem hat dein momentaner Algorithmus quadratische Zeitkomplexität. Ich empfehle eine Umstellung auf std::remove_if() kombiniert mit der erase() -Überladung für eine Iterator-Range, damit kannst du lineare erreichen.


Anmelden zum Antworten