vector mit StringList? Wie gehtz nun?



  • Durch das Delete löscht du das Objekt, der Zeiger im Vector zeigt ins Nirvana.
    Pack das delete in eine Aufräumfunktion, wo du den Vector durchiterierst und alle Elemente löscht. Danach kannst Du Vectro.clear() aufrufen.

    void fillListVector()
    {
     TStringList* tempList = new TStringList();
    tempList->LoadFromFile(Open->FileName);
    
    listVector.push_back(tempList);
    
    //delete tempList; Nicht gut!
    }
    
    void emptyListVector()
    {
        for( std::vector<TStringList*>::Iterator it = listVector.begin();
             it != listVector.end();
             ++it )
        {
            delete *it;
        }
        listVector.clear();
    }
    

    edit: zu langsam



  • wichtig ist nur:

    wenn ich das delete weg lasse, ist auch ausserhalb dieser funktion der komplette inhalt des vectors und der list noch vorhanden?!



  • hm....? schrieb:

    wichtig ist nur:

    wenn ich das delete weg lasse, ist auch ausserhalb dieser funktion der komplette inhalt des vectors und der list noch vorhanden?!

    Ja

    Aber wichtig ist auch, dass das delete dann irgendwo anders steht!



  • ok danke, dann werde ich das morgen mal testen 🙂



  • ok, hab noch eine frage!

    ich möchte natürlich in dem vector mehrere listen speichern:

    void FillListVector()
    {
     TStringList* myList = new TStringList();
    for(int i=0;i<10;++i)
     { 
       myList->LoadFromFile(FileName);
       listVector.push_back(myList);
     }
    }
    

    mein frage:
    da habe ich jetzt so im vector mehrere verschiedene listen, oder immer nur mehrere zeiger auf die selbe liste?

    wenn das so wäre, müsste ich da vorher noch ein listenarray anlegen, wenn ja, wie?

    danke mal wieder



  • Gehen wir doch den Code mal durch.

    Du erstellt eine Stringliste.
    Du lädst eine Datei in die Stringliste.
    Du speicherst den Zeiger auf die Stringliste im vector.

    Schritt 2 und 3 führst Du 10 mal auf ein und dieselbe Stringliste aus. Also hast Du im vector auch 10 mal den gleichen Zeiger auf ein und dieselbe Stringliste. Und der Inhalt der Stringliste ist bei allen identisch. Nämlich das, was Du zuleltzt eingelesen hast.

    Der vector ist das Listenarray! Du mußt natürlich für jeden Durchlauf in der Schleife (respektive für jede einzulesende Datei) eine neue Stringliste mit new erzeugen.

    Im Destruktor der Form, oder an anderer geeigneter Stelle durchläufst Du den vector und löschst die ganzen Stringlisten wieder.



  • Hallo

    da habe ich jetzt so im vector mehrere verschiedene listen, oder immer nur mehrere zeiger auf die selbe liste?

    Letzteres.

    wenn das so wäre, müsste ich da vorher noch ein listenarray anlegen

    Natürlich nicht. Sondern einfach deinen Code so umstellen, das pro Schleifendurchgang genau eine neue StringList-Instanz erstellt wird.

    void FillListVector()
    {
      TStringList* myList;
      for(int i=0;i<10;++i)
      {
        myList = new TStringList();
        myList->LoadFromFile(FileName);
        listVector.push_back(myList);
      }
    }
    

    In diesem Beispiel wird natürlich zehnmal die gleiche Datei in 10 verschiedene TStringLists geladen.

    / Edit : Zu langsam... aber nicht der Letzte 😃

    bis bald
    akari



  • Du hast hier immer den gleichen Zeiger drin. Das ist also falsch mach es besser so.

    void FillListVector()
    {
     for(int i=0;i<10;++i)
     {
       listVector.push_back(new TStringList());
       listVector.back()->LoadFromFile(FileName);
     }
    }
    

    [edit]Ein wenig spät, aber dafür kürzer. 🙂 [edit]



  • wobei ich aber nicht den Sinn verstehe, 10 mal die gleiche Datei in eine andere StringList zu laden.



  • Ich schätze mal, das war nur ein Beispiel.


Anmelden zum Antworten