Verwendung von Listen



  • Hallo,

    ich erstelle zur Laufzeit n Objekte vom Typ "myCube". Diese will ich in einer Liste verwalten. Kann mir jemand sagen, wie ich so eine Liste verwalten kann? Ich konnte keine Codebeispiele finden.

    Gruß
    Alex



  • Was heisst denn "verwalten"?



  • Naja, ich brauche eine Möglichkeit durch alle Objekte zu laufen und ein bestimmtes rauspicken zu können. Man könnte auch ein array nehmen, aber ich kenne die Anzahl der Elemente, die rein sollen, erst zur Laufzeit.



  • Nimm die dynamischen STL-Container, zum Beispiel std::vector<> .



  • zu langsam...



  • Vielen Dank!



  • Hier wäre eine gute Referenz (englisch) dazu: http://www.cplusplus.com/reference/stl/vector/
    Links auf der Seite siehst du gleich noch die anderen Containertemplates (z.B. std::deque<> ).

    In diesem Artikel des Forums ist auch eine sehr gute Beschreibung der einzelnen Container, da kannst du abschätzen, welchen du am ehesten verwenden sollst.



  • typedef std::list<boost::shared_ptr<my_object> > container;
    container c;
    .
    mit objekten füllen 
    .
    containter::const_iterator it=c.begin();
    while(it!=c.end()){
        .
        bla-bla
        .
        ++it;
    }
    


  • Ich wage mal zu bezweifeln, dass der boost::shared_ptr hier irgendwie Klarheit verschafft...



  • std::list<myobject*> mylist;
    std::list<myobject*>::iterator pos;
    
    //einfügen
    mylist.push_back(new myobject());
    
    //mylist.end() ist keines der Objekte
    for (pos=mylist.begin(); pos!=mylist.end(); ++pos)
    {
    	(*pos)->wasauchimmer();
    }
    
    //löschen
    for (pos=mylist.begin(); pos!=mylist.end(); ++pos)
    {
    	delete *pos; //Objekt tatsächlich löschen
    	mylist.erase(pos--); //beim löschen Dekrementieren sonst würde ein Objekt übersprungen
    }
    


  • Warum machst du es mit Zeigern, wenn du die Elemente sowieso neu erstellst? Das macht die ganze Sache nur komplizierter...



  • Nexus schrieb:

    Warum machst du es mit Zeigern, wenn du die Elemente sowieso neu erstellst? Das macht die ganze Sache nur komplizierter...

    Weil die Objekte zbsp in ner Schleife oder Funktion erzeugt werden und um zu verhindern das die Objekte gleich wieder gelöscht werden wird man wohl Zeiger verwenden.
    Auserdem ist es in diesem Fall wichtig vorher die Objekte zu löschen und dann erst den Listeneintrag sonst hat man keinen Zugriff mehr und das wollte ich einbringen in dem Beispiel.



  • Nexus schrieb:

    Warum machst du es mit Zeigern, wenn du die Elemente sowieso neu erstellst? Das macht die ganze Sache nur komplizierter...

    debian inside schrieb:

    Weil die Objekte zbsp in ner Schleife oder Funktion erzeugt werden

    word! @Nexus
    wayne? @linux ^^

    #include <list>
    
    std::list <myobject> mylist;
    
    for (int i (0); i != MAX; ++i)
    {
    mylist.push_back (myobject ());
    }
    

    debian inside schrieb:

    Auserdem ist es in diesem Fall wichtig vorher die Objekte zu löschen und dann erst den Listeneintrag sonst hat man keinen Zugriff mehr

    glaub ich nicht...

    //iter == irgend nen mylist-iterator
    mylist.earase (iter);
    

    reicht völlig aus... dein argument zieht nur, wenn man iwas threaded machen muss - und dann braucht man eh nen lock auf der gesamten liste, wenn man was löscht...

    bb

    PS: Ich kann mich auch irren - aber kann ich mir nicht so recht vorstellen (also das ich jemals falsch liegen würde 😉 )



  • In dieser Schleife wird sofort nach dem Konstruktor der Destruktor aufgerufen und beim list::erase ohne vorher das Objekt richtig zu löschen wird nie der Destruktor aufgerufen.



  • Bei push_back in der Schleife wird mittels Konstruktor ein temporäres Objekt erzeugt. Dies wird dann per CopyCtor in den vector kopiert und dann wird das temporäre Objekt per Destruktor wieder zerstört. So gesehen ist alles ok.



  • Braunstein schrieb:

    Bei push_back in der Schleife wird mittels Konstruktor ein temporäres Objekt erzeugt. Dies wird dann per CopyCtor in den vector kopiert und dann wird das temporäre Objekt per Destruktor wieder zerstört. So gesehen ist alles ok.

    Danke das hab ich noch nicht gewusst und erklärt auch einiges. 😉
    Aber wenn ich trozdem Zeiger verwende muss ich beim Aufruf von list::erase() den Destruktor mit delete aufrufen oder?



  • Genau richtig. 😃


Anmelden zum Antworten