Dynamische Vectoren/Arrays -> "new"



  • Hallo !

    Habe jetzt ca. 20 Minuten hier gesucht und leider keine Antowort auf meine Frage gefunden.

    Ist es mögliche ein Array nach belieben zu vergrössern bwz zu verkleiner je nachdem wieviele Daten abgelegt werden müssen.
    Habe zum Beispiel ein Array mit 5 Elementen nun soll aber ein 6 hinzukommen, wie kann ich jetzt das Array vergrössern ?
    Ebenso wenn ich das 5 Element aus dem Array löschen möchte, wie mache ich das ?

    Gruß Michael



  • Nimm std::vector<T>, oder lege ein neues Array mit der gewünschten Größe an, kopiere die alten Elemente rein und lösche dann das alte Array.



  • Am besten du benützt gleich die STL. Diese beinhaltet einen Typ "vector", ein dynamisches Array, dem man ohne weitere Probleme Objekte hinzufügen kann:

    #include<vector>
    using namespace std;
    
    vector<int> DynamischesIntegerArray;
    
    DynamischesIntegerArray.push_back(5); // Wert am Ende einfügen
    DynamischesIntegerArray.push_back(7);
    

    Du musst auch nicht mit new/delete arbeiten und auf Zeiger aufpassen, da diese Klasse das alles für dich erledigt.

    -----

    Willst du tatsächlich (weil du üben möchtest, etc.) mit new/delete arbeiten und ein Array ist zu klein gehst du folgendermaßen vor:

    int* change_array_size(int* Array,int Size)
    {
        // Neues größeres Array anlegen
        int* NewArray=new int[Size];
    
        // Werte vom alten ins neue kopieren
        for(int i(0);i<Size;++i)
            NewArray[i]=Array[i];
    
        // Altes Array löschen
        delete[] Array;
    
        // Neues Array zurückgeben
        return(NewArray);
    }
    

    MfG SideWinder



  • \aleph_0 schrieb:

    Nimm std::vector<T>, oder lege ein neues Array mit der gewünschten Größe an, kopiere die alten Elemente rein und lösche dann das alte Array.

    So kann mans auch sagen ;).

    MfG SideWinder



  • Tja, std::vector wäre warscheinlich auch das bessere Element für mein Vorhaben.
    Wollte nämlich eine Collection wie es sie in VB gibt programmieren.
    Und zwar mit dem Sinn das ich aud fie Elemente über einen Key zugreifen, oder gibt es soetwas schon und ich mach mir umsonst die Mühe.

    Habe allerdings noch nicht mit std::vector gearbeitet. Gibt es dazu irgendwo etwas zum Einstimmen ???

    Willst du tatsächlich (weil du üben möchtest, etc.) mit new/delete arbeiten und ein Array ist zu klein gehst du folgendermaßen vor:

    Wie oben schon erwähnt. Aber die Arrays zu kopieren dauert ja viel zu lange.

    STL Objekte stehen "mir" in meinem Projekt leider nicht zur Verfügung, da ich eine Win32-Dll programmiere als Ersatz für die VB Collection.



  • Michael__W. schrieb:

    STL Objekte stehen "mir" in meinem Projekt leider nicht zur Verfügung, da ich eine Win32-Dll programmiere als Ersatz für die VB Collection.

    Warum steht Dir keine STL zur Verfügung?



  • Wie oben schon erwähnt. Aber die Arrays zu kopieren dauert ja viel zu lange.

    Also innerhalb der Kapselung werden wohl auch die meisten STL-Vektor-Implementierungen mit Kopieren arbeiten - gibt es da eventl. schon "intelligente" Allokatoren die einfach intern die Adressen verarbeiten und beim Anfordern von mehr Speicher einfach intern einen weiteren Zeiger verarbeiten?

    MfG SideWinder



  • Marc++us schrieb:

    Warum steht Dir keine STL zur Verfügung?

    Sorry, ich habe STL mit ATL verwechselt.
    Ich weiß aber weder noch was ATL noch was STL bedeutet/ist.

    Nun gut, dann werde ich mich wohl für std::vector entscheiden. Das schint mir die klügste Lösung zu sein.
    Gibt es iregendwo Anfängermatrial dazu ???

    Unterstützt std::vector auf Structs ??? Wenn ja wie wird das realsiert ?

    Gruß Michael



  • STL ... Standard Template Libary (der Teil der Standard-Libary der auf Templates basiert 😉 - also Container, Funktionen die für alle Typen vorhanden sein sollen (Alogrithmen))

    std::vector unterstützt dank Templates alle Typen - also auch Structs,Klassen und Unions. std::vector ist allerdings kein eingebauter Typ in der die Sprache intern mit Tricks arbeitet auf die der Programmierer gar keinen Zugriff hat sondern lässt sich auch selbst realisieren (Hat keinen Sinn - es sei denn als Übung).

    std::vector benützen kann man mit Tutorials zur STL. Hier zB ein klitzekleiner Einstieg (natürlich zeigt er nicht was alles mit std::vector möglich ist, aber es zeigt wie man ihn benützen kann): http://www.cprogramming.com/tutorial/stl/vector.html

    Bzw. mit irgendeiner Dokumentation(MSDN Libary dokumentiert zB die Standardlibary vom MSVC - also auch die STL die darin enthalten ist).

    MfG SideWinder



  • Besten Dank.

    Dann bleibt mir wohl vorerst nichts anderes übrig als mir STL Wissen anzueignen.

    P.S.: Eine Frage hätte ich da aber noch. Da ich den Komfort sehr schätze, Elemente über einen Key anzuprechen, könnte ich doch auch Multimaps benutzen ?

    Gruß Michael



  • Eventuell reicht dir auch das:

    const unsigned short int MYKEY (5);
    
    std::vector<int> Vektor;
    
    // Werte einfügen
    
    Vektor[MYKEY]; // Ohne Bereichsüberprüfung
    Vektor.at(MYKEY); // Mit Bereichsüberprüfung
    

    Aber wenn du wirklich immer diese Kombi haben willst Key->Data nimm eine std::map!

    MfG SideWinder


Anmelden zum Antworten