[gelöst] STL, list und for Schleife



  • Hi,

    ich möchte meine ganzen Elemente (class electron) in dem Container list speichern. Jetzt habe ich nur Probleme wie dieser Container über mehrere Durchläufe der for-Schleife hinweg zu benutzen ist.

    Also zunächst initialisiere ich das ganze mittels

    #include <list>
    
    class electron{//
    // Inhalt
    };
    
    int main(){//
    
    list<electron> electrons;    // liste erstellen
    
    for(int i = 0; i < 100; i++)
    {
      list.push_back(electron); // liste füllen
    
      // einiges passiert mit den Elementen der Liste
    
      electrons.clear();  // liste leeren
    }
    
      return 0;
    }
    

    Mein Problem ist jetzt nur, dass nach dieser Methode ich nach dem ersten Durchlauf gar keine Elemente mehr in die Liste kriege? Ich habe bei der Erklärung von list::clear geschaut und da steht jetzt z.B.

    All the elements in the list container are dropped: their destructors are called, and then they are removed from the list container, leaving it with a size of 0.

    Also eigentlich sollte die Liste jetzt einfach leer sein und wenn die for-Schleife einen weiteren Durchlauf hat, sollte mittels list::push_back wieder nach und nach ein Element eingefügt werden.
    Oder übersehe ich da was?

    Umgekehrt habe ich am Ende der for-Schleife den Befehel electrons.clear() einfach mal weggelassen und scheinbar sind nach jedem Durchlauf immer gleich viele Elemente in der Liste, doch müsste die nicht nach und nach weiter- bzw. überlaufen?

    Gruß,
    Klaus.



  • Das von dir beschriebene Verhalten ist korrekt, der Fehler muss woanders liegen. Siehe auch: http://ideone.com/mBmVW



  • Klaus82 schrieb:

    ich möchte meine ganzen Elemente (class electron) in dem Container list speichern.

    Eher nicht. Du willst wohl vector.



  • Kann es sein, dasss du nicht

    list.push_back(electron); // liste füllen
    

    sondern

    electrons.push_back(electron); // liste füllen
    

    haben moechtest?



  • 314159265358979 schrieb:

    Klaus82 schrieb:

    ich möchte meine ganzen Elemente (class electron) in dem Container list speichern.

    Eher nicht. Du willst wohl vector.

    Wieso?

    icarus2 schrieb:

    Kann es sein, dasss du nicht

    list.push_back(electron); // liste füllen
    

    sondern

    electrons.push_back(electron); // liste füllen
    

    haben moechtest?

    Äh, ja. Entschuldige. Steht auch bei mir so im Code, habe die obigen Zeilen aus dem Kopf geschrieben und nicht aus dem Quellcode kopiert.

    Viele Grüße,
    Klaus.



  • Hab den Fehler gefunden, hat sich erledigt!

    Ich hatte noch etwas, das in die die for-Schleife gehörte, um bei jedem neuen Durchlauf auf 0 zurückgesetzt zu werden.

    Sonst war es ab dem 2. Durchlauf immer sofort wieder vorbei, da die Bedingung für die while - Schleife sofort wieder auf false stand. 😉

    Gruß,
    Klaus.



  • Klaus82 schrieb:

    Wieso?

    Weißt du denn, was list überhaupt ist? Wenn ja, wieso verwendest du sie?



  • 314159265358979 schrieb:

    Weißt du denn, was list überhaupt ist? Wenn ja, wieso verwendest du sie?

    Na ja,
    so aus dem Kopf heraus, ohne jetzt im Netz zu spicken, was kann ich darüber sagen.

    List ist ein (assoziativer?) Container aus der STL, STL steht für standard template library. Template ist deshalb praktisch weil ich mittels list<T> einfach einen Typ T vorgeben kann, von int über double bis hin zu ganzen Klassen.

    Weiterhin gibt es für den Iterator, was so ähnlich wie ein Zeiger ist, jede Menge vorgeschriebene nette Funktionen, sodass ich mich in dem Container vorwärts und rückwärts (bidirectional) bewegen kann und Elemente einfügen, löschen, usw.

    Das verstehe ich über einer List. 🙂

    Gruß,
    Klaus.



  • Lies einmal nach, was man genau unter einer verketteten Liste versteht. std::list ist eine doppelt verkettete Liste. std::vecor ist hingegen ein Array mit dynamischer Groesse (und noch ein par anderen Vorteilen gegenueber rohen Arrays).

    Beide haben ihre Vor- und Nachteile. Aus meiner Erfahrung braucht man std::vector allerdings viel oefters als std::list, da es in den meisten Faellen effizienter ist.

    std::vector sollte man auf jeden Fall gut kennen.



  • Klaus82 schrieb:

    Das verstehe ich über einer List. 🙂

    Dann verstehst du nichts darüber was eine list ausmacht, Pi hat recht und du möchtest einen std::vector.
    Der Vorteil von list wäre, dass das Entfernen von Elementen aus der Mitte des Containers auch bei vielen ( > 10k Elementen) sehr schnell geht, weil beim vector alle Elemente hintereinander liegen. Wenn du das nicht brauchst, nimm vector. Er ist einfacher und schneller.



  • cooky451 schrieb:

    Wenn du das nicht brauchst, nimm vector. Er ist einfacher und schneller.

    Alles klar!

    Ich bedanke mich wieder einmal herzlich. 🙂

    Gruß,
    Klaus.



  • Klaus82 schrieb:

    Äh, ja. Entschuldige. Steht auch bei mir so im Code, habe die obigen Zeilen aus dem Kopf geschrieben und nicht aus dem Quellcode kopiert.

    Das ist meistens keine gute Idee. Wenn du aus dem Kopf hinschreibst was du denkst was in deinem Quellcode steht, dann hast du gute Chancen, debi auch den Teil wegzulassen/richtig zu machen, der für Fehler oder unerwartetes Verhalten sorgt. Und unsereiner sucht dann vergeblich nach den Ursachen, weil du nicht deinen tatsächlichen Code postest.


Anmelden zum Antworten