vector-Elemente iterieren und löschen



  • push



  • Vielleicht solltest Du ein neues Thema aufmachen, dessen Titel auch etwas mit Deinem aktuellen Problem zu tun hat. Wenn ich mir nämlich hier Deinen ersten Beitrag durchlese, schreit das ganz einfach nach einer Antwort a la "Benutze erase-remove_if". Ich habe zumindest keine Lust, zu suchen, wo Deine aktuelle Frage steht und worum es eigentlich geht...



  • Der Titel passt und das Problem ist das selbe wie am Anfang.

    Da die Frage scheinbar nicht ganz klar war, habe ich den Startpost jetzt noch etwas erweitert.



  • Is das ne blöde Idee?

    void delete_intersecting_rects(vector<Rectangle>& vec)
    {
        vector<bool> intersects;
        bool intersectTmp;
        for (vector<Rectangle>::iterator iter1 = vec.begin(); iter1 != vec.end(); ++iter1)
        {
            intersectTmp = false;
            for (vector<Rectangle>::iterator iter2 = vec.begin(); iter2 != vec.end(); ++iter2)
            {
                if(iter1==iter2) {
                    continue;
                }
                if (iter1->intersects(*iter2))
                {
                    intersectTmp = true;
                    break;
                }
            }
            intersects.push_back(intersectTmp);
        }
        int position = intersects.size() -1 ;
        for(vector<bool>::reverse_iterator ri = intersects.rbegin(); ri != intersects.end(); ++ri, --position)
        { //von hinten löschen, damit vorne die positionierung nicht verkackt weil der rest nachrutscht
            if(*ri)
            {
                vec.erase(vec.begin()+position);
            }
        }
    }
    

    Bin grad a bißerl müde und unkonzentriert, also verzeih falls ich da grad nen fundamentalen fehler mache, aber so sollts zumindest gehen. Die Prüfung am Anfang kann man noch optimieren, weil man jedes paar doppelt prüft - aber zufaul drüber gedanken zu machen.



  • Hm, ich hatte die Idee, einen vector<size_type> zu erstellen, mit dem die Indexe der zu löschenden Elemente gespeichert werden. Deine vector<bool>-Idee gefällt mir besser, aber ich find es trotzdem nicht so toll, wenn man einen neuen vector dafür erstellen muss.
    Vielleicht kennt ja jemand eine noch bessere Lösung 🙂


Anmelden zum Antworten