Handhabung von Arrays in C++

  • Hallo Leute,

    trotz Resignation vor dem extremen Lowlevel-Flair von C++, stoße ich immer wieder auf neue Hürden, die ich aus den sophistizierteren Sprachen nicht kenne. Aktuell sind angesagt: Arrays mit variablen Dimensionen und das Fehlen einer foreach-Funktion.

    Kann mich mal jemand aufklären?

    Vielleicht ein profanes Beispiel zum Anstoß:

    Herausforderung: Berechnung des arithmetischen Mittels aus Werten, die vorab eingelesen und in einem eindimensionalen Array gespeichert werden.
    Hürden: Anzahl der eingebbaren Werte unbegrenzt (bis auf technische Grenzen des Speichers beispielsweise) und Ermittlung der Anzahl, durch die geteilt wird.

    • • • – • – – • – –

  • Disclaimer: Ich kann kein C++, ich kann nur C. Möge jemand mit Ahnung das hier korrigieren.

    Arrays dynamischer Länge (also feste Länge, die aber erst zur Laufzeit bekannt ist) sind son Ding. Weil Grösse des Stacks zur Compile-Time berechnet wird, sowas wie

    Code
    void foo(int n) { 
     int[] bar[n];
    }

    Ist schwierig zu kompilieren. Meines Wissens kein Standard-C++, auch wenns manche Compiler können. Speicherst du das Array auf dem Heap, dann ist das kein Ding, weil da der Platz erst zur Laufzeit reserviert wird.

    Code
    void foo(int n) {
        int[] bar = new int[n]; 
        // ...
        delete [] bar;
    }

    Musst du dann aber halt auch auch von Hand wieder Löschen.

    Wenn ich deinen Beitrag aber richtig verstehe weisst du die Anzahl Elemente gar nicht im voraus? Dann empfiehlt sich eh die Verwendung von std::vector, scheint mir eh die Datenstruktur der Wahl zu sein, die das C++-Universum zusammenhält.

    foreach gibts in der Tat nicht, iteriere einfach über den Index gibt aber irgendwelche C++-Iteratoren die ich nicht kenne, die aber nicht komplizierter scheinen als Iteration über den Index (kann wie gesagt kein C++), das ist offenbar auch beim vector die Methode der Wahl: http://www.yolinux.com/TUTORIALS/Linu…STL.html#VECTOR

    Einmal editiert, zuletzt von gandro (6. Januar 2013 um 17:47)

  • Ohne new wäre was im sinn von

    Code
    struct flexarray
    {
      int values[10];
      int count;
      *flexarray next;
    }


    denkbar, was einfach so viele arrays einer größe zusammenhängt, wie nötig sind. ist aber etwas unschön

    Spoiler anzeigen


    Haupt-Laptop:
    Dell Vostro 3560 - i7-3632QM, 6GB
    Rechenknechte:
    Lenovo - i5, 4GB
    Medion - Pentium Dual Core, 3GB
    IBM T60 - Core Duo, 2GB
    Lenovo T400 - Core2Duo, 2GB
    Server:
    Sony - Pentium M, 512MB
    Unbenutzt:
    Noname - Celeron D, 1GB

    Einmal editiert, zuletzt von niwax (6. Januar 2013 um 17:49)

  • Kann man allgemein sagen, dass Arrays dynamischer Größe (also solche, die zur Laufzeit unbestimmt wachsen können), ein Luxus sind, der für C++ nicht vorgesehen ist?

    Einer der wichtigsten Vorteile von Arrays im Gegensatz zum Einsatz statischer Variablen, geht dadurch verloren, nämlich eine unbestimmte Anzahl von zu verarbeitenden Werten.

    … oder hat sich gar eine möglichst große »Für-alle-Fälle«-Dimensionierung à la int foo[65536]; eingebürgert?

    • • • – • – – • – –

  • Wie gesagt, der std::vector (der im Grunde genau macht was niwax vorgeschlagen hat, nur halt bereits vorimplementiert und getestet) ist exakt für deinen Fall da und nichts anderes. Die C++-Arrays sind halt etwas Low-Leveliger als das was dir Java anbietet, und was PHP oder Python unter Array verstehen ist bei C++ schlicht der Vektor.

    Kein C++-Programmierer mit Verstand mit sowas wie int foo[65536], sondern verwendet einen Vektor dafür. Er bietet dir praktisch gleiche Geschwindigkeit wie ein Array, aber ohne das selber verwalten zu müssen. Und ich glaube auch mit Bounds-Checking. Benutz den Vektor. Ernsthaft.

    Einmal editiert, zuletzt von gandro (6. Januar 2013 um 18:07)


  • Ohne new wäre was im sinn von […] denkbar, was einfach so viele arrays einer größe zusammenhängt, wie nötig sind. ist aber etwas unschön

    Abgesehen davon, dass die C++-Standardbibliothek wie gesagt ein ordentliches System von Collections hat und du da C-mäßig statt einer verketteten Liste eine verkettete Liste von Listen(knoten) implementierst (?!), wie anders als mit einem C-mäßigen calloc wölltest du dann deine Liste erweitern?


  • Kann man allgemein sagen, dass Arrays dynamischer Größe (also solche, die zur Laufzeit unbestimmt wachsen können), ein Luxus sind, der für C++ nicht vorgesehen ist?

    Einer der wichtigsten Vorteile von Arrays im Gegensatz zum Einsatz statischer Variablen, geht dadurch verloren, nämlich eine unbestimmte Anzahl von zu verarbeitenden Werten.

    Das ist ein Luxus, der in keiner Sprache vorgesehen ist, was du von anderen Sprachen vielleicht als "dynamisches Array" kennst wird wohl ne gekapselte verkette Liste (siehe niwax) oder sonst ne lustige Datenstruktur sein. Für ein wirkliches dynamisches Array müsstest du das Array aufgrund von Speicherfragmentierung ständig verschieben wenns größer wird - und das ist enorm ineffizient. Glaub kaum dass das irgend ein Compiler machen wird.

    „Zitate von sich selbst in der Signatur sind doof.“ Chrisse, 2009
    „Hmm... mal was aus 2010 reinnehmen“ Chrisse, 2010
    „Ach, wie die Zeit vergeht...“ Chrisse, 2011
    „Bin immernoch dagegen“ Chrisse, 2012
    „Jetzt auch mit 2013“ Chrisse, 2013
    „2021 ich komme“ Chrisse, 2014
    „Ab jetzt wieder länger“ Chrisse, 2015
    „Gut Ding will Weile haben“ Chrisse, 2016
    „Meine Signatur: Öfter geupdated als mein Windows“ Chrisse, 2017
    „Klicken sie weiter, hier gibt es nichts zu lesen“ Chrisse, 2018
    „Dieser Post kann Spuren von Sarkasmus enthalten“ Chrisse, 2019
    „Reinstate Chiaki“ Chrisse, 2020
    „2021 ist eine Coverstory der Moderation und nie passiert!“, Chrisse, 2022

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!