Wie bekomme ich die Größe eines Arrays? [Duplikat]

7

In C # verwende ich die Length-Eigenschaft, die in das Array eingebettet ist, von dem ich gerne die Größe erhalten möchte. Wie geht das in C ++?

    
Ivan Prodanov 17.05.2009, 08:43
quelle

5 Antworten

12

Arrays in C / C ++ speichern ihre Längen nicht im Speicher, so dass es unmöglich ist, ihre Größe zu finden, wenn ein Zeiger auf ein Array gegeben wird. Jeder Code, der Arrays in diesen Sprachen verwendet, benötigt eine konstante bekannte Größe oder eine separate Variable, die die Größe angibt.

Eine gängige Lösung für dieses Problem ist die Verwendung des std::vector Klasse aus der Standardbibliothek, die viel näher an einem verwalteten (C #) Array ist, dh speichert ihre Länge und hat zusätzlich ein paar nützliche Elementfunktionen (zum Suchen und Bearbeiten).

Mit std::vector können Sie einfach vector.size() aufrufen, um seine Größe / Länge zu erhalten.

    
Noldorin 17.05.2009, 08:45
quelle
14

Es hängt wirklich davon ab, was Sie mit "Array" meinen. Arrays in C ++ haben eine Größe (was jetzt die "rohe" Byte-Größe bedeutet), die N mal der Größe eines Elements entspricht. Dadurch kann man die Anzahl der Elemente mit dem Operator sizeof leicht ermitteln. Dies erfordert jedoch, dass Sie weiterhin Zugriff auf den Typ dieses Arrays haben. Sobald Sie es an Funktionen übergeben, wird es in Zeiger umgewandelt, und dann sind Sie verloren. Es kann keine Größe mehr ermittelt werden. Sie müssen einen anderen Weg konstruieren, der auf dem Wert der Elemente beruht, um die Größe zu berechnen.

Hier sind einige Beispiele:

%Vor%

Wenn wir nun den Namen "a" (und damit seinen Typ) verlieren, indem wir beispielsweise "pa" an eine Funktion übergeben, wo diese Funktion nur dann den Wert dieses Zeigers hat, dann haben wir kein Glück. Wir können dann die Größe nicht mehr erhalten. Wir müssten die Größe zusammen mit dem Zeiger auf diese Funktion übergeben.

Die gleichen Einschränkungen gelten, wenn wir ein Array mit new erhalten. Es gibt einen Zeiger zurück, der auf die Elemente dieses Arrays zeigt, und somit ist die Größe verloren.

%Vor%

Es kann kein Zeiger zurückgegeben werden, der den Typ des Arrays enthält, da die Größe des mit new erstellten Arrays zur Laufzeit berechnet werden kann. Aber Typen in C ++ müssen zur Kompilierzeit gesetzt werden. Daher löscht new diesen Array-Teil und gibt stattdessen einen Zeiger auf die Elemente zurück. Beachten Sie, dass Sie in C ++ nicht mit new herumhantieren müssen. Sie können die Vorlage std::vector verwenden, wie von einer anderen Antwort empfohlen.

    
Johannes Schaub - litb 17.05.2009 09:30
quelle
5

Um die Anzahl der Elemente in einem statischen Array zu zählen, können Sie eine Template-Funktion erstellen:

%Vor%

Für Standardcontainer wie std::vector wird die Funktion size() verwendet. Dieses Muster wird auch bei Boost-Arrays verwendet, bei denen es sich um Arrays mit fester Größe und Anspruch handelt keine schlechtere Leistung gegenüber statischen Arrays. Der Code, den Sie in einem Kommentar oben haben, sollte sein:

%Vor%

(unter der Annahme, dass sich die Größe in der Schleife ändert, heben Sie sie sonst auf), anstatt die Größe als Elementvariable zu behandeln.

    
Pete Kirkham 17.05.2009 10:02
quelle
0

In C / C ++ sind Arrays einfach Zeiger auf das erste Element im Array, daher gibt es keine Möglichkeit, die Größe oder Anzahl der Elemente zu verfolgen. Sie müssen eine Ganzzahl übergeben, die die Größe des Arrays angibt, wenn Sie es verwenden müssen.

Die Länge von Strings may wird unter der Annahme, dass sie null-terminiert sind, mithilfe der Funktion strlen () bestimmt, die jedoch nur bis zum Zeichen \ 0 zählt.

    
Gavin H 17.05.2009 08:47
quelle
0

Als Nolrodin oben erwähnt, ist es ziemlich unmöglich, die Größe eines einfachen Arrays in C ++ zu erhalten, wenn Sie nur einen Zeiger auf sein erstes Element haben. Wenn Sie jedoch ein Array fester Größe haben, gibt es einen bekannten C-Trick, um die Anzahl der Elemente im Array zur Kompilierungszeit zu berechnen, nämlich indem Sie:

%pr_e%

    
Timo Geusch 17.05.2009 09:10
quelle

Tags und Links