foreach in C++ int-array
Ich bin neu in C++ und ich Schreibe den folgenden code.
Ich brauchte für die Iteration über alle addons in meinem aufrufenden Funktion - testFunction
. Ich weiß, das funktioniert in C#, aber dieser code funktioniert nicht. Kann mir jemand bitte darauf, den richtigen Weg, es zu tun in C++?
#include "stdafx.h"
#include <iostream>
#include "resource.h"
int testFunction(char* tester);
int _tmain()
{
int mainProd=2;
int Addons[]={7,8,9,10};
testFunction(mainProd,Addons);
}
void testFunction(int mainProd,int addons[])
{
for(int x = 0 ; addons.length;++x) ---- Not working
{
std::cout<< addons[x];
}
}
Habe ich versucht zu implementieren, Vektor, wie unten Vorschläge von Euch
#include "stdafx.h"
#include <iostream>
#include "resource.h"
#include <vector>
void testFunction(std::vector<int> addons);
int _tmain(int argc, _TCHAR* argv[])
{
std::vector<int> Addons ;
for(int i = 0 ;i<10;++i)
{
Addons.push_back(i);
}
testFunction(Addons);
}
void testFunction(std::vector<int> addons)
{
for(int i =0 ; i<addons.size();++i)
{
std::cout<<addons.at(i);
}
}
- Wo hast du die Idee, dass
.length
funktionieren würde? Vielleicht müssen Sie wählen ein besseres Buch? - Was macht Ihre Lieblings-C++ - Buch sagen?
- fordward deklarieren Sie die richtige version von testFunction zu.
- pass-by-reference das Vektor, um zu vermeiden, unnötige Exemplaren
void testFunction(const std::vector<int> &addons) // note the 'const' and the '&'
for(int i =0 ; i<addons.size();++i)
ist schlechter Stil für die Iteration über einen Vektor. Verwendenbegin
undend
statt.- ist schlechter Stil, dieses argument hat nie mich überzeugt. Gibt es ein besseres für diesen Fall (wenn wir uns nicht in Betracht, um ein anderes enthalten als std::vector)? Beachten Sie, dass C++11 nicht entfernt mit
begin
undend
bei Verwendung der range-Schleifefor(auto i:addons)
. - C++11 nicht tun, Weg mit ihm; ich denke, die reichen-für die ist schrecklich. Es ist leicht effizienteren Verwendung von Iteratoren, die direkt für Vektoren, und wesentlich effizienter für andere Behälter. Insgesamt aber, ist es konsistent. Können Sie rip out your
std::vector
und verwenden Sie einestd::list
oderstd::set
und code haben, der immer noch funktioniert. - Ja, ich weiß, dieses argument (wie angedeutet in meinem letzten Kommentar), es ist viel besser, als schlechter Stil. Btw, ich habe nicht gesagt, C++11 nicht entfernt mit
begin
undend
-- Lesen Sie meinen Kommentar sorgfältig durch! - Da man sich mit C++11, können Sie Ihre vector mit Liste der Initialisierung:
std::vector<int> Addons = {7,8,9,10};
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einem array (ein raw array) zerfällt in einen pointer übergeben wird, als argument an eine Funktion, so dass das array keine Größe Informationen.
Muss man die Länge des Arrays explizit in die Funktion zu wissen, ist es in der Funktion.
Alternativ und besser, verwenden Sie eine
std::vector
und dann haben Sie die.size()
bei Bedarf immer zur Verfügung.std::array
wenn die Größe wird fest zur compile-Zeit.char*
parameter deklariert werden, bevor Sie Ihre Haupt-und nur die richtige nach. ideone.com/2H1xX8Abgesehen von der Verwendung von Vektoren, wie Tony schon sagt, können Sie Vorlagen verwenden und das array als Verweis übergeben, so dass der compiler ableiten, die den array-Größe:
Sind Sie mit Konzepten von C# in C++, aber, auch wenn wir davon ausgehen, dass beide Sprachen sind ähnlich, Sie sind nicht gleich.
Die syntax für einen ranged-in C++ ist die folgenden:
Diese können Sie verwenden für Geschmack wenn Sie eine C++11 compiler.
Btw, es scheint, dass Sie über Eigenschaften auf den code:
Es gibt keine solche Sache in C++, wenn Sie wollen, nennen eine Objekt-Methode Sie aufrufen müssen, es als eine Funktion:
Aber die
addons
variable ist nicht ein Objekt, ein array (werfen Sie einen Blick auf dieses tutorial), so dass es nicht eine Methode oder Eigenschaft mit dem Namenlength
; wenn Sie brauchen, zu wissen, seiner Länge, um es Durchlaufen, die Sie verwenden können, in einigen Kontexten diesizeof
- operator (siehe tutorial für weitere Informationen).Nehmen wir an, dass
addons
wurden container:Wenn Sie möchten, Durchlaufen Sie mit dem C++11-Reihe -, dann kann man Sie wie folgt schreiben:
Hoffe, es hilft.
Wenn Sie verwenden ein
std::vector
oderstd::array
könnten Siestd::foreach
,std::foreach
vsrange-for
sein könnte, eine Frage des Geschmacks?std::begin()
undstd::end()
. (Nicht, dass ich würde empfehlen die Verwendung von raw-arrays)Code ist das arbeiten mit dieser
for (int i = 0; i < (end(array) - begin(array)); i++)
Rendite maximale Größe
Testen, ob array leer ist
Element von array
Array-Größe
Wenn Sie nicht möchten, zu verwenden STL-container, die Sie gerade brauchen, um das array übergeben durch Verweis auf die Funktion. Problem hier ist, dass man nicht definieren, eine solche Argumentation ohne genaue Angabe der Größe des Arrays. Diese Einschränkung können Sie überwinden, macht die Funktion als Vorlage, Definition der Größe der Vorlage-parameter: