C++ 2d_Arrays Zeilen mit dynamischer Länge erstellen



  • Ich hab im Netz ein Beispiel gefunden,

    hm... das ist nicht unbedingt immer eine gute Idee. Dein Beispielcode solltest du so nicht schreiben (benutze bitte kein rohes new / delete, siehe R11 und R60.

    Die Anforderung "jede Zeile soll unterschiedlich viele Spalten haben" steht ja irgendwie im Kontrast zu einem 2d-Array - das hat ja gerade in jeder Zeile gleich viele Elemente.

    Um im Wesentlichen bei deiner Datenstruktur zu bleiben, würde ich erstmal auf einen std::vector<std::vector<double>> umstellen. Dann geht die manuelle Speicherverwaltung weg und du kannst in jeder Zeile unterschiedliche Längen haben. (aber nenne es nicht mehr 2d-Array).

    Siehe https://en.cppreference.com/w/cpp/container/vector
    Der vector kennt seine Länge auch schon selbst.

    Zusätzlich zu der ganzen Speicherproblematik in deinem Programm kommt ja noch, dass du auch die Längen der einzelnen Zeilen irgendwo speichern müsstest. (Es sei denn, du hast eine Dreiecksmatrix, dann ginge das logischerweise auch anders)



  • Um noch etwas den Ausführungen von @wob hinzuzufügen:

    Ein Array ist ein zusammenhängender Speicherbereich, per Definition. Wenn beide Dimensionen zur Laufzeit ihre Größe ändern sollen ist das kein Array mehr.



  • @wob sagte in C++ 2d_Arrays Zeilen mit dynamischer Länge erstellen:

    Zusätzlich zu der ganzen Speicherproblematik in deinem Programm kommt ja noch, dass du auch die Längen der einzelnen Zeilen irgendwo speichern müsstest. (Es sei denn, du hast eine Dreiecksmatrix, dann ginge das logischerweise auch anders)

    Leicht abschweifend: Echt ein Jammer, dass diese Information eliminiert und vor dem User versteckt wird. Die new/ delete[]-Implementierung muss ja schliesslich wissen, wie viele Objekte später zu dekonstruieren sind. In der Praxis sieht das dann so aus, dass die Länge tatsächlich gespeichert wird (meist an einer Adresse vor dem zurückgegebenen Pointer), aber man keinen Zugriff auf diese Information hat.

    Das delete[] muss dann auch noch die Länge auslesen, mit einem zusätzlichen Speicherzugriff auf den reservierten Heap (statt auf den Stack, der oft bereits "heiß" im Cache liegt). Alles in allem ein ziemliches Gefrickel und noch ein Grund mehr, einen geschachtelten vector zu nehmen, wie du vorgeschlagen hast: Der kennt seine Länge, teilt sie auf Anfrage mit und muss dafür auch nicht extra auf den Nutzdaten-Speicherbereich zugreifen.

    ... nur um mal ein bisschen mit dem Missverständnis aufzuräumen, dass diese (dynamischen) lowlevel-C-Arrays irgendwie "effizienter" sein könnten, weil die scheibar keine Abstraktion drumherum haben.



  • Dankeschön für die sehr ausführlichen Antworten. Ich bin eindeutig blutiger Anfänger mit C++, auch wenn ich schon in Python programmiert habe. Daher bin ich dankbar für die vielseitigen Anregungen hier. Ich werde mich nun mit dem "vector" beschäftigen. Ich habe aus den Poasts hier zwei wertvolle Seiten zum Nachschlagen erhalten: 1) en.cppreference.com 2) C++ Core Guidelines
    Da ich mir C++ autodidaktisch mit mehreren Udemy-Kursen reinziehe: Gibt es gute Nachschlagewerke für C++, welche Ihr mir ans Herz legen würdet???
    Und - Danke für dieses tolle Forum hier, mit soviel Input hatte ich nicht gerechnet.
    Gruß Ingo


  • Mod

    Die beiden Standardreferenzen sind en.cppreference.com (kennst du schon) und cplusplus.com. Die haben zwar auch beide einen kleinen Teil, wo die Sprache an sich erklärt wird, aber sie ersetzen nicht wirklich ein Lehrbuch. Solche Nachschlagewerke sind für Leute gedacht, die schon wissen was sie tun, aber nicht die gesamte Standardbibliothek auswendig können.



  • Schau einfach mal in die Linkliste.

    Online kann ich dir auch Learn C++ zum Einstieg empfehlen.


  • Mod

    @Th69 sagte in C++ 2d_Arrays Zeilen mit dynamischer Länge erstellen:

    Schau einfach mal in die Linkliste.

    Da hätte ich mal eine spontane Frage an einen Nichtmoderator: Kann man die Links zum Magazin eigentlich lesen? Denn das Magazin liegt in einem archivierten Teil des Forums, von dem ich nicht sicher bin, ob er für die Öffentlichkeit überhaupt zugänglich ist. Wenn nicht, würde ich den Abschnitt entfernen, ist ja sowieso alles auf prä-C++11 Stand.



  • Das Inhaltsverzeichnis des Magazins kann man nicht aufrufen, aber die darunterstehenden Artikel schon (nur beim ersten ist ein Fehler in der URL: da ist ein h bei https zu viel).

    Edit: Der richtige Link dazu ist Inhaltsverzeichnis des Magazins.
    Auch weitere Links noch mit http://magazin.c-plusplus.net/artikel (bei "GUI-Programmierung") sind nicht aufrufbar, aber über das Inhaltsverzeichnis auffindbar (bzw. dessen URLs müßten dann dort verwendet werden).



  • @Ingolf_008 sagte in C++ 2d_Arrays Zeilen mit dynamischer Länge erstellen:

    Gibt es gute Nachschlagewerke für C++, welche Ihr mir ans Herz legen würdet???

    https://en.cppreference.com/w/
    https://cplusplus.com/reference/


  • Mod

    @Th69 sagte in C++ 2d_Arrays Zeilen mit dynamischer Länge erstellen:

    Das Inhaltsverzeichnis des Magazins kann man nicht aufrufen, aber die darunterstehenden Artikel schon (nur beim ersten ist ein Fehler in der URL: da ist ein h bei https zu viel).

    Edit: Der richtige Link dazu ist Inhaltsverzeichnis des Magazins.
    Auch weitere Links noch mit http://magazin.c-plusplus.net/artikel (bei "GUI-Programmierung") sind nicht aufrufbar, aber über das Inhaltsverzeichnis auffindbar (bzw. dessen URLs müßten dann dort verwendet werden).

    Danke! Ich habe korrigiert, was du und ich finden konnten.



  • Ein paar Mal sind immer noch http://magazin.c-plusplus.net/inhaltsverzeichnis referenziert (habe ich gefunden, indem ich den Seitenquelltext nach magazin. durchsucht habe).

    Vllt. kannst du die letzten Beiträge in ein eigenes Thema unter "Forentechnik" abspalten?


Anmelden zum Antworten