Gibt es eine Möglichkeit herauszufinden, wie viele Werte ein Array hat? Es würde auch funktionieren, zu erkennen, ob ich das Ende eines Arrays erreicht habe oder nicht.
Woher kommt das Array? Normalerweise benötigen Funktionen, die Arrays verwenden, auch einen Längenparameter, um dieses Problem zu lösen.
Michael Myers
2
Nun, ich mache ein "mad libs" -Programm, das ein Array mit dem gesamten Text sowie den Positionen der Substantive / Verben enthält, die der Benutzer ausfüllen muss. Ich möchte eine Funktion verwenden, um das zu durchlaufen gesamtes Array, wobei die Werte "[Nomen]" und "[Verb]" durch vom Benutzer eingegebenen Text ersetzt werden.
Maxpm
Mögliches Duplikat der
Rechenlänge
5
Bitte beachten Sie, dass in C-Arrays keine Objekte oder Strukturen sind. Daher ist standardmäßig nirgendwo ein Längenparameter gespeichert. Wenn Sie mit ihnen als Objekte in C ++ arbeiten möchten, verwenden Sie die C ++ - Objekte std :: vector oder std :: array von C ++ 11, wenn Sie können. Wenn Sie Zeiger verwenden müssen, übergeben Sie immer die Länge des Arrays als zweiten Parameter an jede Funktion, die damit arbeitet.
Pihhan
Wenn Sie C ++ 20 verwenden, habe ich auch darauf eine Antwort hinzugefügt. Es könnte leicht übersehen werden, da es hier so viele Antworten gibt.
gprathour
Antworten:
511
Wenn Sie ein Array im C-Stil meinen, können Sie Folgendes tun:
int a[7];
std::cout <<"Length of array = "<<(sizeof(a)/sizeof(*a))<< std::endl;
Das funktioniert nicht auf Zeiger (dh es wird nicht Arbeit für eine der folgenden):
int*p =newint[7];
std::cout <<"Length of array = "<<(sizeof(p)/sizeof(*p))<< std::endl;
Es funktioniert auch nicht, wenn Sie das Array an eine andere Funktion übergeben und versuchen, es dort zu tun :)
San Jacinto
23
@ San Jacinto: Nein, dies funktioniert (auf Arrays ), egal in welcher Funktion Sie sich befinden. Das Übergeben eines Arrays variabler Länge an eine Funktion als Parameter ist jedoch unmöglich (es zerfällt in einen Zeiger) - aber wenn Sie eine übergeben Array innerhalb einer Struktur, dann funktioniert dies wie erwartet.
Gleichung
1
@OliverCharlesworth auch wenn Sie das Array als Wert an eine andere Funktion übergeben und dort ausprobiert haben, wird es nicht funktionieren, oder? Die Frage ist warum
A_Matar
5
@A_Matar - Sie können ein Array in C oder C ++ nicht als Wert übergeben.
Oliver Charlesworth
1
@yusha - sie sind das gleiche.
Oliver Charlesworth
142
Wie andere gesagt haben, können Sie das verwenden, sizeof(arr)/sizeof(*arr)aber dies gibt Ihnen die falsche Antwort für Zeigertypen, die keine Arrays sind.
Dies hat die nette Eigenschaft, dass es nicht möglich ist, für Nicht-Array-Typen zu kompilieren (Visual Studio hat _countofdies). Das constexprmacht dies zu einem Ausdruck für die Kompilierungszeit, sodass es keine Nachteile gegenüber dem Makro hat (zumindest keine, die ich kenne).
Sie können auch std::arrayC ++ 11 verwenden, das seine Länge ohne Overhead über ein natives C-Array verfügbar macht.
C ++ 17 hat std::size()im <iterator>Header das Gleiche und funktioniert auch für STL-Container (dank @Jon C ).
@yau es ist, wie Sie einen Verweis auf ein Array schreiben , siehe diese Antwort . Meine Version sieht etwas anders aus, da ich den Namen des Parameters weggelassen habe, da der Parameter nicht verwendet wird, sondern nur sein Typ benötigt wird. Mit einem Namen wäre es T(arg&)[N].
Motti
1
Danke Motti! Der ausgelassene Parametername war mir bereits klar. Aber unglaublich, dass ich anscheinend noch nie zuvor Refs / Zeiger auf Arrays verwendet habe . Und wahrscheinlich auch nicht in der Zukunft, da solche Arrays noch mehr aussterben.
@IsaacPascual Ich war nicht vertraut extent, da ich es jetzt betrachte, gibt es zwei Eigenschaften, die es weniger nützlich machen als die obige Funktion (für diesen Anwendungsfall). (1) Für Zeiger wird Null zurückgegeben (anstelle eines Kompilierungsfehlers). (2) Es erfordert einen Typparameter. Um eine Variable zu überprüfen, müssten Sie dies tundecltype
Motti
86
Dadurch sizeof( myArray )erhalten Sie die Gesamtzahl der für dieses Array zugewiesenen Bytes. Sie können dann die Anzahl der Elemente im Array ermitteln, indem Sie durch die Größe eines Elements im Array dividieren:sizeof( myArray[0] )
Dies ist eine sehr einfache und einfache Lösung, um ein scheinbar uraltes Problem zu lösen.
4
Funktioniert nicht für "neue" C ++ - Arrays, die von einem Zeiger gehalten werden. Sie erhalten die Größe des Zeigers (4 Byte) oder die Größe seines ersten Elements, wenn Sie ihn dereferenzieren.
DragonLord
1
@DragonLord Ja, obwohl jeder, der die Größe des Arrays mit dem Schlüsselwort new deklariert, die Größe des Arrays bereits zur Laufzeit kennt, muss in diesem Fall der Operator sizeof nicht verwendet werden, um die Größe des Arrays zu ermitteln. Ich bin sicher, dass du das weißt. Dies ist nur zum Nutzen aller, die dies nicht tun.
Martyn Shutt
@ Surega Es wird nicht abstürzen
CITBL
60
Obwohl dies eine alte Frage ist, lohnt es sich, die Antwort auf C ++ 17 zu aktualisieren. In der Standardbibliothek gibt es jetzt die Vorlagenfunktion std::size(), die die Anzahl der Elemente in einem Standardcontainer oder einem Array im C-Stil zurückgibt. Zum Beispiel:
+1 für Vektoren. Es gibt nur noch wenige Fälle, in denen C ++ - Arrays im alten Stil verwendet werden. Es sei denn, die Größe des Arrays wird sich nie ändern, aber selbst dann sollten Sie stattdessen die Array-Containerklasse verwenden. Es ist besser, eine Containerklasse wie einen Vektor für die dynamische Array-Speicherung zu verwenden. Die Vorteile der Verwendung von Containerklassen überwiegen bei weitem die Nachteile der Verwaltung Ihres eigenen Speichers.
Martyn Shutt
@MartynShutt Wenn Sie wie in gamedev an den Cache gebunden sind, können Sie es sich manchmal nicht leisten, einen Vektor zu verwenden.
Tara
30
std::vectorhat eine Methode, size()die die Anzahl der Elemente im Vektor zurückgibt.
Ich glaube, dass dies nur für lokale Variablen funktioniert, die sich auf dem Stapel befinden.
DragonLord
Dies ist die beste Antwort. @DragonLord, es funktioniert auch für Mitgliedsvariablen. Siehe cpp.sh/92xvv .
Shital Shah
24
Seit C ++ 11 werden einige neue Vorlagen eingeführt, um die Schmerzen beim Umgang mit der Array-Länge zu verringern. Alle von ihnen sind in der Kopfzeile definiert <type_traits>.
Wenn Tes sich um einen Array-Typ handelt, wird der Elementkonstantenwert angegeben, der der Anzahl der Dimensionen des Arrays entspricht. Für jeden anderen Typ ist der Wert 0.
Wenn Tes sich um einen Array-Typ handelt, wird der Elementkonstantenwert angegeben, der der Anzahl der Elemente entlang der Ndritten Dimension des Arrays entspricht, wenn Nin [0, std::rank<T>::value). Für jeden anderen Typ oder wenn Tdas Array unbekannt in seiner ersten Dimension gebunden Nist und 0 ist, ist der Wert 0.
Wenn Tes sich um ein Array eines Typs handelt X, wird der Typ typeedef des Mitglieds gleich angegeben X, andernfalls ist type T. Beachten Sie, dass bei Teinem mehrdimensionalen Array nur die erste Dimension entfernt wird.
Wenn Tes sich um ein mehrdimensionales Array eines Typs handelt X, wird der Typ typeedef des Elements gleich angegeben X, andernfalls ist type T.
Um die Länge für eine beliebige Dimension eines multidimentiellen Arrays zu ermitteln, decltypekann eine Kombination mit verwendet werden std::extent. Zum Beispiel:
#include<iostream>#include<type_traits>// std::remove_extent std::remove_all_extents std::rank std::extenttemplate<class T,size_t N>constexprsize_t length(T(&)[N]){return N;}template<class T,size_t N>constexprsize_t length2(T(&arr)[N]){returnsizeof(arr)/sizeof(*arr);}int main(){int a[5][4][3]{{{1,2,3},{4,5,6}},{},{{7,8,9}}};// New wayconstexprauto l1 = std::extent<decltype(a)>::value;// 5constexprauto l2 = std::extent<decltype(a),1>::value;// 4constexprauto l3 = std::extent<decltype(a),2>::value;// 3constexprauto l4 = std::extent<decltype(a),3>::value;// 0// Mixed wayconstexprauto la = length(a);//constexpr auto lpa = length(*a); // compile error//auto lpa = length(*a); // get at runtime
std::remove_extent<decltype(a)>::type pa;// get at compile time//std::remove_reference<decltype(*a)>::type pa; // same as aboveconstexprauto lpa = length(pa);
std::cout << la <<' '<< lpa <<'\n';// Old wayconstexprauto la2 =sizeof(a)/sizeof(*a);constexprauto lpa2 =sizeof(*a)/sizeof(**a);
std::cout << la2 <<' '<< lpa2 <<'\n';return0;}
BTY, um die Gesamtzahl der Elemente in einem multidimentionalen Array zu erhalten:
constexprauto l =sizeof(a)/sizeof(std::remove_all_extents<decltype(a)>::type);
In C ++ kann man mithilfe der std :: array-Klasse zum Deklarieren eines Arrays leicht die Größe eines Arrays und auch das letzte Element ermitteln.
#include<iostream>#include<array>int main(){
std::array<int,3> arr;//To find the size of the array
std::cout<<arr.size()<<std::endl;//Accessing the last elementauto it=arr.end();
std::cout<<arr.back()<<"\t"<<arr[arr.size()-1]<<"\t"<<*(--it);return0;}
Nett; Ich sehe, du hast viele Fähigkeiten; und ... großartiger Ansatz. Ich denke, ich sollte auch selbst mehr Antworten auf so berühmte Fragen schreiben
;-)
5
Dies ist eine ziemlich alte und legendäre Frage, und es gibt bereits viele erstaunliche Antworten. Mit der Zeit werden den Sprachen jedoch neue Funktionen hinzugefügt, sodass wir die Dinge entsprechend den neuen verfügbaren Funktionen ständig aktualisieren müssen.
Mir ist gerade aufgefallen, dass noch niemand etwas über C ++ 20 erwähnt hat. Also dachte ich, ich schreibe eine Antwort.
C ++ 20
In C ++ 20 gibt es eine neue bessere Möglichkeit, der Standardbibliothek die Länge des Arrays zu ermitteln, d std:ssize(). H. Diese Funktion gibt a zurück signed value.
Nur zu Ihrer Information, wenn Sie sich fragen, warum dieser Ansatz nicht funktioniert, wenn das Array an eine andere Funktion übergeben wird . Der Grund ist,
Ein Array wird in C ++ nicht als Wert übergeben, sondern der Zeiger auf das Array wird übergeben. Wie in einigen Fällen kann das Übergeben der gesamten Arrays ein teurer Betrieb sein. Sie können dies testen, indem Sie das Array an eine Funktion übergeben und dort einige Änderungen am Array vornehmen und das Array dann erneut in main drucken. Sie erhalten aktualisierte Ergebnisse.
Und wie Sie bereits wissen, sizeof()gibt die Funktion die Anzahl der Bytes an, sodass in einer anderen Funktion die Anzahl der dem Zeiger zugewiesenen Bytes und nicht das gesamte Array zurückgegeben wird. Dieser Ansatz funktioniert also nicht.
Aber ich bin sicher, Sie können einen guten Weg finden, dies gemäß Ihren Anforderungen zu tun.
ARRAYSIZE (arr) überprüft die Größe von (arr) (Anzahl der Bytes im Array) und sizeof (* (arr)) (Anzahl der Bytes in einem Array-Element). Wenn das erstere durch das letztere teilbar ist, ist arr möglicherweise tatsächlich ein Array. In diesem Fall ist das Teilungsergebnis die Anzahl der Elemente im Array. Andernfalls kann arr möglicherweise kein Array sein, und wir generieren einen Compilerfehler, um zu verhindern, dass der Code kompiliert wird.
Da die Größe von bool implementierungsdefiniert ist, müssen wir! (Sizeof (a) & sizeof (* (a))) in size_t umwandeln, um sicherzustellen, dass das Endergebnis den Typ size_t hat.
Dieses Makro ist nicht perfekt, da es bestimmte Zeiger fälschlicherweise akzeptiert, nämlich wenn die Zeigergröße durch die Spitzengröße teilbar ist. Da unser gesamter Code einen 32-Bit-Compiler durchlaufen muss, bei dem ein Zeiger 4 Byte groß ist, werden alle Zeiger auf einen Typ mit einer Größe von 3 oder mehr als 4 (zu Recht) abgelehnt.
mit einem Array von Ganzzahlen wie folgt: int nombres[5] = { 9, 3 };Diese Funktion gibt 5statt zurück 2.
Anwar
GOOGLE_ARRAYSIZE(new int8_t)kehrt 8auf meiner Testumgebung zurück, anstatt einen Fehler auszulösen. Der gegossene Teil scheint überflüssig zu sein, ganz zu schweigen vom schreienden C-Makro. sizeof(a) / sizeof(*a)funktioniert weit genug als Legacy-Lösung.
3
Für C ++ / CX (beim Schreiben von UWP-Apps mit C ++ in Visual Studio) können wir die Anzahl der Werte in einem Array mithilfe der size()Funktion ermitteln.
Dieses Code-Snippet kann das Problem zwar lösen, erklärt jedoch nicht, warum oder wie es die Frage beantwortet. Bitte geben Sie eine Erklärung für Ihren Code an, da dies wirklich zur Verbesserung der Qualität Ihres Beitrags beiträgt. Denken Sie daran, dass Sie die Frage für Leser in Zukunft beantworten und diese Personen möglicherweise die Gründe für Ihren Code-Vorschlag nicht kennen
Balagurunathan Marimuthu
3
ANTWORT :
int number_of_elements =sizeof(array)/sizeof(array[0])
ERKLÄRUNG :
Da der Compiler für jeden Datentyp einen bestimmten Speicherbereich beiseite legt und ein Array einfach eine Gruppe davon ist, teilen Sie einfach die Größe des Arrays durch die Größe des Datentyps. Wenn ich ein Array mit 30 Zeichenfolgen habe, reserviert mein System 24 Bytes für jedes Element (Zeichenfolge) des Arrays. Bei 30 Elementen sind das insgesamt 720 Bytes. 720/24 == 30 Elemente. Der kleine, enge Algorithmus dafür ist:
int number_of_elements = sizeof(array)/sizeof(array[0]) das entspricht
number_of_elements = 720/24
Beachten Sie, dass Sie nicht wissen müssen, um welchen Datentyp es sich bei dem Array handelt, auch wenn es sich um einen benutzerdefinierten Datentyp handelt.
Es ist jedoch einfach, eloquent, schnell, plattformunabhängig und macht das Einfügen von Vektoren oder Zeigern überflüssig. Was das Täuschen anderer Antworten angeht, scheint es nur eine andere Antwort mit demselben Algorithmus zu geben, und diese gibt keine Erklärung für die zugrunde liegende Mechanik des Problems wie meine Antwort. Ich schlage respektvoll vor, dass es nicht fehleranfällig, sondern ziemlich robust ist.
Bob Warner
1
Nur ein Gedanke, aber gerade beschlossen, eine Zählervariable zu erstellen und die Arraygröße in Position [0] zu speichern. Ich habe den größten Teil des Codes gelöscht, den ich in der Funktion hatte, aber nach dem Verlassen der Schleife wird prime [0] der Endwert 'a' zugewiesen. Ich habe versucht, Vektoren zu verwenden, aber VS Express 2013 hat das nicht sehr gut gefallen. Beachten Sie auch, dass 'a' bei eins beginnt, um ein Überschreiben [0] zu vermeiden, und am Anfang initialisiert wird, um Fehler zu vermeiden. Ich bin kein Experte, dachte nur, ich würde teilen.
int prime[]={0};int primes(int x,int y){usingnamespace std;int a =1;for(int i = x; i <= y; i++){prime[a]= i; a++;}
prime[0]= a;return0;}
@bobbogo Funktioniert mit Inline oder Constexpr. Vielleicht hatten Sie Inline deaktiviert oder es ist optional? ideone.com/VxogJ4
QuentinUK
@ QentinUK constexprist das Update . inlineist nicht. constexprist aber ziemlich modern. Sind Sie sicher, dass Ihr Testprogramm keine andere moderne Funktion verwendet, mit der Sie ein lokales Array deklarieren können, dessen Länge durch eine Variable angegeben wird? Versuchen Sie es mit zwei globalen Arrays.
Dies ist die richtige Antwort. Sehr portabel unter C ++ - Versionen, funktioniert nicht mit Zeigern, und die Antwort ist zur Kompilierungszeit verfügbar
Bobbogo
1
Ich biete hier eine knifflige Lösung:
Sie können immer lengthim ersten Element speichern :
// malloc/new
arr[0]= length;
arr++;// do anything. int len =*(arr-1);
free(--arr);
Die Kosten müssen Sie --arrbeim Aufrufen tragenfree
Dies funktioniert nur, wenn arrder Typ kompatibel ist intund das Array nicht länger als der Maximalwert des Typs ist. ZB sind Pascal-Strings mit diesem Trick tatsächlich Byte-Arrays. Die maximale Länge von Zeichenfolgen in Pascal beträgt 255 Zeichen.
Palec
Ich nehme an, man könnte am Anfang jedes Arrays etwa 8 Bytes reservieren und ein vorzeichenloses Long verwenden, wenn Objekte gespeichert werden sollen. Ich denke, ein Vektor ist wahrscheinlich einfacher. Aber definitiv eine gute Lösung für eingebettete Systeme.
Aj.toulan
1
Sie können die Länge eines Arrays wie folgt ermitteln:
int arr[]={1,2,3,4,5,6};int size =*(&arr +1)- arr;
cout <<"Number of elements in arr[] is "<< size;return0;
Ich persönlich würde vorschlagen (wenn Sie aus irgendeinem Grund nicht mit speziellen Funktionen arbeiten können), zuerst die Kompatibilität des Arrays-Typs über das hinaus zu erweitern, als was Sie normalerweise verwenden würden (wenn Sie Werte ≥ 0 speichern würden:
unsignedint x[]->int x[]
als Sie das Array 1-Element größer machen würden, als Sie es machen müssen. Für das letzte Element würden Sie einen Typ einfügen, der im erweiterten Typbezeichner enthalten ist, den Sie jedoch normalerweise nicht verwenden würden, z. B. im vorherigen Beispiel wäre das letzte Element -1. Auf diese Weise können Sie (mithilfe einer for-Schleife) das letzte Element eines Arrays finden.
Einer der häufigsten Gründe, warum Sie danach suchen würden, ist, dass Sie ein Array an eine Funktion übergeben möchten und kein anderes Argument für seine Größe übergeben müssen. Im Allgemeinen möchten Sie auch, dass die Arraygröße dynamisch ist. Dieses Array enthält möglicherweise Objekte, keine Grundelemente, und die Objekte sind möglicherweise so komplex, dass size_of () eine nicht sichere Option für die Berechnung der Anzahl ist.
Wie andere vorgeschlagen haben, sollten Sie anstelle eines primitiven Arrays einen std :: -Vektor oder eine Liste usw. verwenden. Auf alten Compilern hätten Sie jedoch immer noch nicht die endgültige Lösung, die Sie wahrscheinlich wollen, wenn Sie dies einfach tun, da das Auffüllen des Containers eine Reihe hässlicher push_back () -Zeilen erfordert. Wenn Sie wie ich sind, möchten Sie eine einzeilige Lösung mit anonymen Objekten.
Antworten:
Wenn Sie ein Array im C-Stil meinen, können Sie Folgendes tun:
Das funktioniert nicht auf Zeiger (dh es wird nicht Arbeit für eine der folgenden):
oder:
Wenn Sie in C ++ ein solches Verhalten wünschen, sollten Sie eine Containerklasse verwenden. wahrscheinlich
std::vector
.quelle
Wie andere gesagt haben, können Sie das verwenden,
sizeof(arr)/sizeof(*arr)
aber dies gibt Ihnen die falsche Antwort für Zeigertypen, die keine Arrays sind.Dies hat die nette Eigenschaft, dass es nicht möglich ist, für Nicht-Array-Typen zu kompilieren (Visual Studio hat
_countof
dies). Dasconstexpr
macht dies zu einem Ausdruck für die Kompilierungszeit, sodass es keine Nachteile gegenüber dem Makro hat (zumindest keine, die ich kenne).Sie können auch
std::array
C ++ 11 verwenden, das seine Länge ohne Overhead über ein natives C-Array verfügbar macht.C ++ 17 hat
std::size()
im<iterator>
Header das Gleiche und funktioniert auch für STL-Container (dank @Jon C ).quelle
T(arg&)[N]
.extent
, da ich es jetzt betrachte, gibt es zwei Eigenschaften, die es weniger nützlich machen als die obige Funktion (für diesen Anwendungsfall). (1) Für Zeiger wird Null zurückgegeben (anstelle eines Kompilierungsfehlers). (2) Es erfordert einen Typparameter. Um eine Variable zu überprüfen, müssten Sie dies tundecltype
Dadurch
sizeof( myArray )
erhalten Sie die Gesamtzahl der für dieses Array zugewiesenen Bytes. Sie können dann die Anzahl der Elemente im Array ermitteln, indem Sie durch die Größe eines Elements im Array dividieren:sizeof( myArray[0] )
quelle
Obwohl dies eine alte Frage ist, lohnt es sich, die Antwort auf C ++ 17 zu aktualisieren. In der Standardbibliothek gibt es jetzt die Vorlagenfunktion
std::size()
, die die Anzahl der Elemente in einem Standardcontainer oder einem Array im C-Stil zurückgibt. Zum Beispiel:quelle
Ja!
Versuchen
sizeof(array)/sizeof(array[0])
Ich sehe keinen Weg dafür, es sei denn, Ihr Array ist ein Array von Zeichen (dh Zeichenfolge).
PS: In C ++ immer verwenden
std::vector
. Es gibt mehrere eingebaute Funktionen und eine erweiterte Funktionalität.quelle
std::vector
hat eine Methode,size()
die die Anzahl der Elemente im Vektor zurückgibt.(Ja, das ist eine ironische Antwort)
quelle
quelle
Seit C ++ 11 werden einige neue Vorlagen eingeführt, um die Schmerzen beim Umgang mit der Array-Länge zu verringern. Alle von ihnen sind in der Kopfzeile definiert
<type_traits>
.std::rank<T>::value
Wenn
T
es sich um einen Array-Typ handelt, wird der Elementkonstantenwert angegeben, der der Anzahl der Dimensionen des Arrays entspricht. Für jeden anderen Typ ist der Wert 0.std::extent<T, N>::value
Wenn
T
es sich um einen Array-Typ handelt, wird der Elementkonstantenwert angegeben, der der Anzahl der Elemente entlang derN
dritten Dimension des Arrays entspricht, wennN
in [0,std::rank<T>::value
). Für jeden anderen Typ oder wennT
das Array unbekannt in seiner ersten Dimension gebundenN
ist und 0 ist, ist der Wert 0.std::remove_extent<T>::type
Wenn
T
es sich um ein Array eines Typs handeltX
, wird der Typ typeedef des Mitglieds gleich angegebenX
, andernfalls ist typeT
. Beachten Sie, dass beiT
einem mehrdimensionalen Array nur die erste Dimension entfernt wird.std::remove_all_extents<T>::type
Wenn
T
es sich um ein mehrdimensionales Array eines Typs handeltX
, wird der Typ typeedef des Elements gleich angegebenX
, andernfalls ist typeT
.Um die Länge für eine beliebige Dimension eines multidimentiellen Arrays zu ermitteln,
decltype
kann eine Kombination mit verwendet werdenstd::extent
. Zum Beispiel:BTY, um die Gesamtzahl der Elemente in einem multidimentionalen Array zu erhalten:
Oder fügen Sie es in eine Funktionsvorlage ein:
Weitere Beispiele für deren Verwendung finden Sie unter den folgenden Links.
quelle
Es gibt auch den Weg TR1 / C ++ 11 / C ++ 17 (siehe Live on Coliru):
quelle
Anstatt die eingebaute Array-Funktion aka zu verwenden:
Sie sollten die Array-Klasse und die Array-Vorlage verwenden. Versuchen:
Wenn Sie nun die Länge des Arrays ermitteln möchten, müssen Sie lediglich die Größenfunktion in der Array-Klasse verwenden.
und das sollte die Länge der Elemente im Array zurückgeben.
quelle
In C ++ kann man mithilfe der std :: array-Klasse zum Deklarieren eines Arrays leicht die Größe eines Arrays und auch das letzte Element ermitteln.
Tatsächlich verfügt die Array-Klasse über viele andere Funktionen, mit denen wir Array als Standardcontainer verwenden können.
Referenz 1 zu C ++ std :: array class
Referenz 2 zu std :: array class
Die Beispiele in den Referenzen sind hilfreich.
quelle
Dies ist eine ziemlich alte und legendäre Frage, und es gibt bereits viele erstaunliche Antworten. Mit der Zeit werden den Sprachen jedoch neue Funktionen hinzugefügt, sodass wir die Dinge entsprechend den neuen verfügbaren Funktionen ständig aktualisieren müssen.
Mir ist gerade aufgefallen, dass noch niemand etwas über C ++ 20 erwähnt hat. Also dachte ich, ich schreibe eine Antwort.
C ++ 20
In C ++ 20 gibt es eine neue bessere Möglichkeit, der Standardbibliothek die Länge des Arrays zu ermitteln, d
std:ssize()
. H. Diese Funktion gibt a zurücksigned value
.C ++ 17
In C ++ 17 gab es (zu dieser Zeit) einen besseren Weg für denselben, der in
std::size()
definiert istiterator
.PS Diese Methode funktioniert auch für
vector
.Alt
Dieser traditionelle Ansatz wird bereits in vielen anderen Antworten erwähnt.
Nur zu Ihrer Information, wenn Sie sich fragen, warum dieser Ansatz nicht funktioniert, wenn das Array an eine andere Funktion übergeben wird . Der Grund ist,
Ein Array wird in C ++ nicht als Wert übergeben, sondern der Zeiger auf das Array wird übergeben. Wie in einigen Fällen kann das Übergeben der gesamten Arrays ein teurer Betrieb sein. Sie können dies testen, indem Sie das Array an eine Funktion übergeben und dort einige Änderungen am Array vornehmen und das Array dann erneut in main drucken. Sie erhalten aktualisierte Ergebnisse.
Und wie Sie bereits wissen,
sizeof()
gibt die Funktion die Anzahl der Bytes an, sodass in einer anderen Funktion die Anzahl der dem Zeiger zugewiesenen Bytes und nicht das gesamte Array zurückgegeben wird. Dieser Ansatz funktioniert also nicht.Aber ich bin sicher, Sie können einen guten Weg finden, dies gemäß Ihren Anforderungen zu tun.
Viel Spaß beim Codieren.
quelle
Sie haben eine Reihe von Optionen, um eine C-Array-Größe zu erhalten.
int myArray [] = {0, 1, 2, 3, 4, 5, 7};
1) sizeof(<array>) / sizeof(<type>):
2) sizeof(<array>) / sizeof(*<array>):
3) sizeof(<array>) / sizeof(<array>[<element>]):
quelle
Hier ist eine Implementierung
ArraySize
von Google Protobuf .quelle
int nombres[5] = { 9, 3 };
Diese Funktion gibt5
statt zurück2
.GOOGLE_ARRAYSIZE(new int8_t)
kehrt8
auf meiner Testumgebung zurück, anstatt einen Fehler auszulösen. Der gegossene Teil scheint überflüssig zu sein, ganz zu schweigen vom schreienden C-Makro.sizeof(a) / sizeof(*a)
funktioniert weit genug als Legacy-Lösung.Für C ++ / CX (beim Schreiben von UWP-Apps mit C ++ in Visual Studio) können wir die Anzahl der Werte in einem Array mithilfe der
size()
Funktion ermitteln.Quellcode:
Wenn Sie
cout
diesize_of_array
Ausgabe wird sein:quelle
sizeof(array_name)
gibt die Größe des gesamten Arrays undsizeof(int)
die Größe des Datentyps jedes Array-Elements an.Wenn Sie also die Größe des gesamten Arrays durch die Größe eines einzelnen Elements des Arrays dividieren, erhalten Sie die Länge des Arrays.
quelle
ANTWORT :
ERKLÄRUNG :
Da der Compiler für jeden Datentyp einen bestimmten Speicherbereich beiseite legt und ein Array einfach eine Gruppe davon ist, teilen Sie einfach die Größe des Arrays durch die Größe des Datentyps. Wenn ich ein Array mit 30 Zeichenfolgen habe, reserviert mein System 24 Bytes für jedes Element (Zeichenfolge) des Arrays. Bei 30 Elementen sind das insgesamt 720 Bytes. 720/24 == 30 Elemente. Der kleine, enge Algorithmus dafür ist:
int number_of_elements = sizeof(array)/sizeof(array[0])
das entsprichtnumber_of_elements = 720/24
Beachten Sie, dass Sie nicht wissen müssen, um welchen Datentyp es sich bei dem Array handelt, auch wenn es sich um einen benutzerdefinierten Datentyp handelt.
quelle
Nur ein Gedanke, aber gerade beschlossen, eine Zählervariable zu erstellen und die Arraygröße in Position [0] zu speichern. Ich habe den größten Teil des Codes gelöscht, den ich in der Funktion hatte, aber nach dem Verlassen der Schleife wird prime [0] der Endwert 'a' zugewiesen. Ich habe versucht, Vektoren zu verwenden, aber VS Express 2013 hat das nicht sehr gut gefallen. Beachten Sie auch, dass 'a' bei eins beginnt, um ein Überschreiben [0] zu vermeiden, und am Anfang initialisiert wird, um Fehler zu vermeiden. Ich bin kein Experte, dachte nur, ich würde teilen.
quelle
Eine gute Lösung, die Generika verwendet:
Rufen Sie dann einfach
arraysize(_Array);
auf, um die Länge des Arrays zu ermitteln.Quelle
quelle
constexpr
ist das Update .inline
ist nicht.constexpr
ist aber ziemlich modern. Sind Sie sicher, dass Ihr Testprogramm keine andere moderne Funktion verwendet, mit der Sie ein lokales Array deklarieren können, dessen Länge durch eine Variable angegeben wird? Versuchen Sie es mit zwei globalen Arrays.Für den alten g ++ - Compiler können Sie dies tun
quelle
Ich biete hier eine knifflige Lösung:
Sie können immer
length
im ersten Element speichern :Die Kosten müssen Sie
--arr
beim Aufrufen tragenfree
quelle
arr
der Typ kompatibel istint
und das Array nicht länger als der Maximalwert des Typs ist. ZB sind Pascal-Strings mit diesem Trick tatsächlich Byte-Arrays. Die maximale Länge von Zeichenfolgen in Pascal beträgt 255 Zeichen.Sie können die Länge eines Arrays wie folgt ermitteln:
quelle
Sie können einfach diesen Ausschnitt verwenden:
und hier ist die Referenz: http://www.cplusplus.com/reference/array/array/size/
quelle
Vermeiden Sie es, den Typ zusammen mit sizeof, as zu verwenden
sizeof(array)/sizeof(char)
plötzlich , wenn Sie den Typ des Arrays ändern.Im Visual Studio haben Sie das Äquivalenz if
sizeof(array)/sizeof(*array)
. Sie können einfach eingeben_countof(array)
quelle
Ich persönlich würde vorschlagen (wenn Sie aus irgendeinem Grund nicht mit speziellen Funktionen arbeiten können), zuerst die Kompatibilität des Arrays-Typs über das hinaus zu erweitern, als was Sie normalerweise verwenden würden (wenn Sie Werte ≥ 0 speichern würden:
als Sie das Array 1-Element größer machen würden, als Sie es machen müssen. Für das letzte Element würden Sie einen Typ einfügen, der im erweiterten Typbezeichner enthalten ist, den Sie jedoch normalerweise nicht verwenden würden, z. B. im vorherigen Beispiel wäre das letzte Element -1. Auf diese Weise können Sie (mithilfe einer for-Schleife) das letzte Element eines Arrays finden.
quelle
Einer der häufigsten Gründe, warum Sie danach suchen würden, ist, dass Sie ein Array an eine Funktion übergeben möchten und kein anderes Argument für seine Größe übergeben müssen. Im Allgemeinen möchten Sie auch, dass die Arraygröße dynamisch ist. Dieses Array enthält möglicherweise Objekte, keine Grundelemente, und die Objekte sind möglicherweise so komplex, dass size_of () eine nicht sichere Option für die Berechnung der Anzahl ist.
Wie andere vorgeschlagen haben, sollten Sie anstelle eines primitiven Arrays einen std :: -Vektor oder eine Liste usw. verwenden. Auf alten Compilern hätten Sie jedoch immer noch nicht die endgültige Lösung, die Sie wahrscheinlich wollen, wenn Sie dies einfach tun, da das Auffüllen des Containers eine Reihe hässlicher push_back () -Zeilen erfordert. Wenn Sie wie ich sind, möchten Sie eine einzeilige Lösung mit anonymen Objekten.
Wenn Sie sich für eine STL-Container-Alternative zu einem primitiven Array entscheiden, kann dieser SO-Beitrag für Sie hilfreich sein, um ihn zu initialisieren: Was ist der einfachste Weg, einen std :: -Vektor mit fest codierten Elementen zu initialisieren?
Hier ist eine Methode, die ich dafür verwende und die universell über Compiler und Plattformen hinweg funktioniert:
Erstellen Sie eine Struktur oder Klasse als Container für Ihre Objektsammlung. Definieren Sie eine Operatorüberladungsfunktion für <<.
Sie können Funktionen erstellen, die Ihre Struktur als Parameter verwenden, z.
Dann können Sie diese Funktion folgendermaßen aufrufen:
Auf diese Weise können Sie eine Sammlung von Objekten mit dynamischer Größe erstellen und an eine Funktion in einer einzigen klaren Linie übergeben!
quelle
Nehmen wir an, Sie haben ein globales Array oben auf der Seite deklariert
Geben Sie den folgenden Code ein, um herauszufinden, wie viele Elemente (in c ++) im Array vorhanden sind:
Die Größe von (NAME_OF_ARRAY) / 4 gibt Ihnen die Anzahl der Elemente für den angegebenen Array-Namen zurück.
quelle