gezieltes löschen von Instanzen



  • Hallo,

    Ich weiß derzeit nicht wie folgendes lösen soll: Also ich habe ca. 30.000 Instanzen einer Klasse, die Klasse besitzt unter anderem ein bool welches standardmässig auf true ist. Durch verschiedene Funktion wird dies auf false gesetezt. Diese Instanzen sollen gelöscht werden, was wäre die beste Lösung? Die Instanzen in eine Liste schieben und mit dem iterator löschen?

    Danke für jede Hilfe 🙂 🙂



  • Wo sind denn die Objekte drin? Also wie hälst du sie im Moment?



  • Also ich habe so erzeugt:
    cDreieck *pDreieck;
    pDreieck = new cDreieck[Anzahl];



  • Da kannst du jetzt aber keine einzelnen Objekte rauslöschen. Du musst die Objekte einzeln allokieren und in einer Liste speichern. Dann kannst du die da auch ganz einfach rauslöschen.



  • So in etwa? Ich glaube meine Syntax ist da noch nicht ganz richtig^^

    class Beispiel
    {
    bool aehnlich;
    class ()
    {
    bool = true;
    }
    void Funktion ()
    {
    //macht irgendwie das es entweder false oder true ist
    }
    }

    main ()
    {
    Beispiel *pBeispiel;
    pBeispiel = new Beispiel[30];

    list <Beispiel> Liste;
    list <Beispiel>::iterator i;

    for(int i = 0;i < 30;i++)
    {
    pBeispiel[i].Funktion();
    Liste.push_back(pBeispiel[i]);
    }

    for(i = i.begin();i != i.end(); ++i)
    {
    if(*i->aehnlich == false)
    {
    Liste.erase(i);
    }
    }
    return 0;
    }



  • Das geht schon, ist aber nicht das, was du willst..

    Du brauchst/willst eher so etwas:

    std::list<Beispiel*> list;
    
    for (int i = 0; i < 300 ; i++)
        list.push_back ( new Beispiel ); //füllen
    
    ...
    
    std::list<Beispiel*>::iterator it = std::find ( ... ); //wie auch immer an einen iterator kommen
    
    delete *it; //zuerst speicher freigeben
    list.erase ( it ); //und dann aus der Liste entfernen
    ...
    

    Da würde man normalerweise eher einen Smart Poiner benutzen, dann fällt das freigeben mit delete auch wieder weg und man kann auch die remove Funktionen benutzen, welche effizienter sind.



  • Ah Danke! Werd' ich gleich mal ausprobieren. Und ja hast Recht, das ist eher was ich will 😃



  • Wenn du wirklich Zeiger auf die Objekte speichern willst (ist oft nicht nötig, die meisten Container legen ihre Elemente bereits auf dem Heap an), kannst du dir vielleicht auch mal Boost.Pointer Container anschauen.



  • Und ich werfe mal std::remove_if in den Raum.



  • Badestrand schrieb:

    Und ich werfe mal std::remove_if in den Raum.

    Vielleicht noch anzumerken, dass der Name irreführen kann. Die Elemente werden nicht wirklich gelöscht, sondern nur ans Ende der Sequenz verschoben. Mit der Memberfunktion erase() kann man eine Iterator-Range (z.B. den Rückgabewert von remove_if() bis end() ) wirklich aus dem Container entfernen.


Anmelden zum Antworten