tr1::array als funktionsargument
-
Hallo,
ich möchte ein tr1::array als Funktionsargument übergeben und dachte da an so etwas:
void abc(array<array<double>> &vec) const;Jetzt meldet mir der Compiler dass ich gefälligst die Größe des Arrays mit angeben sollte. Wozu? Wie kann man es umgehen wenn man nicht weiß wie groß die Dimensionen des übergebenen Arrays sein werden?
Danke
-
Ein
std::arrayhat eine feste Größe. Du suchst etwas wiestd::vector
-
Die Größe des Arrays ist Teil des Typs. Der Typ array<double,3> ist ein anderer als array<double,5>.
> Wie kann man es umgehen ... ?
Zum Beispiel: statt array einfach vector benutzen.
-
So zum Beispiel: http://ideone.com/XHk75
-
314159265358979 schrieb:
So zum Beispiel: http://ideone.com/XHk75
Das sieht gut aus, aber würde es aber auch damit funktionieren?
array<array<3>,GetCount()> vec; ... // Befüllen ... a(vec);Wahrscheinlich nicht weil n ja während der Laufzeit vorgegeben wird während das Template zur Kompilierzeit für einen bestimmten Typ generiert wird oder sehe ich das falsch?
Wahscheinlich muss ich doch noch zum vector greifen.
-
Das erzeugt einen enormen Code Bloat für eine Sache, die man mit weniger Code und ohne Code Bloat wesentlich eleganter mit einem std::vector lösen kann.
-
Was hast du eigentlich gegen std::vector?
-
Ich finde, wenn ein vector nicht unbedingt gebraucht wird, dann soll er doch ein std::array nutzen.
@GastProgrammierer: Richtig, templates sind Compiletime-Konstrukte, das wird so nicht funktionieren.
-
fghfgh schrieb:
Was hast du eigentlich gegen std::vector?
Es fühlt sich für mich falsch an ein dynamisch wachsendes array (vector) für Aufgaben zu nehmen dort wo man die Größe "eigentlich" kennt.
Da jedoch schon mehrere sich zum vector geäußert haben scheint es die übliche Vorgehensweise zu sein.
-
Ich verwende array immer, wo es geht, weil ich hier keine dynamische Allokation brauche, was einen Geschwindigkeitsvorteil bringt. Wenn du also nichts dynamisches brauchst, dann kannst du ruhig das array nehmen.
-
Man sollte sich nicht von seinem Gefühlen leiten lassen. Wir sind hier nicht bei Star Wars!

Im ernst, ein Vector ist kein lebender Organismus. Er wächst tatsächlich nur dann wenn er es muß. Trau dich!

-
GastProgrammierer schrieb:
Wahrscheinlich nicht weil n ja während der Laufzeit vorgegeben wird während das Template zur Kompilierzeit für einen bestimmten Typ generiert wird oder sehe ich das falsch?
Genau, C-Arrays und
std::tr1::arrayerfordern für ihre Grösse konstante Ausdrücke, die bereits zur Kompilierzeit feststehen. Nimm alsostd::vector.Oder wenn du Boost hast und mehrdimensionale Arrays brauchst, kannst du auch
boost::multi_arrayanschauen.
-
Nexus schrieb:
Oder wenn du Boost hast und mehrdimensionale Arrays brauchst, kannst du auch
boost::multi_arrayanschauen.Boost ist ein gutes Stichwort. Es ist alles schön mit Boost multi_array implementiert. Mein Arbeitgeber besteht jedoch darauf, dass die Implementierung Boostfrei bleibt und da er bezahlt darf er den Takt vorgeben.