Anzahl eines arrays in c++ ermitteln?
Ich bin noch ein Anfänger in Sachen Programmierung. Ich habe einen Array
Getraenk[5]. Jetzt möchte ich herausfinden wie ich die Anzahl ausgeben kann sprich am Ende soll bei der cout Ausgaben eine 5 stehen weil ja 5 Elemente drin sind. Jetzt sitze ich schon einige Zeit hier aber habe keine ahnung wie das geht. Könnt ihr mir helfen, vielleicht sogar mit Code als Beispiel? Bin noch ein Anfänger also bitte so einfach wie möglich
2 Antworten
De sauberste Lösung ab C++17 sähe so aus:
constexpr auto len { 5ul };
int arr[len] {};
Die zweitsauberste Lösung, die man oft verwendet, wenn man mit Templates hantiert, geht so:
#include <type_traits> // extent
// ...
int arr[5] {};
using namespace ::std;
cout << extent<decltype(arr)>() << endl;
Die uralte C-Lösung, die heute auch noch oft verwendet wird, sieht so aus:
int arr[5] {};
cout << (sizeof(arr) / sizeof(*arr)) << endl;
Das ist natürlich völlig OK, wenn du in C programmierst, aber fehleranfällig, weshalb du bei C++ ::std::extent nehmen solltest. Das hat den Vorteil, dass du eine schöne Fehlermeldung bekommst, falls der Typ nicht stimmt.
Alles in allem solltest du bei C++ grundsätzlich auf - oft einfacher wirkende - Herangehensweisen aus C verzichten, weil C an einfach zu vielen Stellen quasi keine Typsicherheit kennt. (void-Zeiger, Format-Strings, Varargs, Preprozessor-Magie, uvm.)
Von daher: Gewöhne dir die Nutzung von extent an ... und nebenbei auch allen anderen Dingen, die du im <type_traits> Header findest. (Da dich das momentan aber alles noch überfordern würde, lerne erst mal die Grundlagen fertig und guck dir das genanannte in einem halben Jahr ruhig mal an!)
Viel Spaß! :)
Nachtrag: Die allersauberste Lösung wäre natürlich <array> zu ntzen:
#include <array>
// ...
::std::array<int, 5> arr {};
cout << arr.size() << endl;
Da man in modernem C++ sowieso keine "nackten" Arrays mehr nutzen sollte, ist <array> grundsätzlich zu bevorzugen. Das hat neben Typsicherheit nur Vorteile. Zum Beispiel "kennt" ein solches Array immer seine eigene Größe und hat dabei keinen zusätzlichen Laufzeitoverhead.
Ich hatte das in meiner Antwort erst nicht erwähnt, weil ich dich nicht mit den vielen Möglichkeiten erschlagen wollte, aber jetzt denke ich mir, dass du wenigstens mal davon gehört haben solltest.
Herkömmliche C-artige Arrays werden oft implizit zu Zeigern "degradiert", wenn sie an Funktionen übergeben werden, wodurch sie das Wissen über ihre eigene Größe verlieren.
Und leider liest man immer noch oft, dass Zeiger und Arrays fast das gleiche sind, was noch nie gestimmt hat, aber so oft wiederholt wurde, dass es viele Entwickler tatsächlich glauben.
Bei zum Beispiel ...
int arr[5] {};
... gehört die 5 zum Typen von "arr" und diese Tatsäche ist vielen Entwicklern tatsächlich gar nicht bewusst.
Aber egal. Falls du irgendwann mal die Grundlagen hinter dir gelassen hast, merke dir einfach, dass es <array> für Stellen gibt, an denen du herkömmliche Arrays nutzen würdest, und extent() kannst du bei Legacy-Code nutzen.
Gar nicht. Zumindest nicht sinnvoll.
Im besten Fall könnte das funktionieren, sofern du das Array nicht an eine andere Funktion übergeben oder ähnliches tun willst:
int deinArray[5];
std::cout << "Bis zu " << (sizeof(deinArray)/sizeof(int)) << " Elemente." << std::endl;
Ansonsten wäre es für C++ allerdings sinnvoller eine Klasse wie std::vector bzw. std::array zu verwenden.