Forum: PC-Programmierung c++ array zu vektor


von Benny (Gast)


Lesenswert?

Hi.

Auf der Suche nach einer Möglickkeit ein Array in einen Vektor zu 
konvertieren bin ich auf folgendes Template gestoßen:

template< typename T, size_t N >
std::vector<T> makeVector( const T (&data)[N] )
{
    return std::vector<T>(data, data+N);
}

const int values[] = { 1,2,3,7 };
std::vector<double> array = makeVector(values);

Auch weil man hier nichts hardkodieren muß(Array-Größe) finde ich das 
Template passend für meine Zwecke. Nur ist mir nicht genau klar wie im 
Template die Größe N vom Compiler bestimmt wird. Bitte um Aufklärung 
;-).

Gruß
Benny

von Ahab (Gast)


Lesenswert?

Benny schrieb:
> Template die Größe N vom Compiler bestimmt wird.

Die wird nicht "bestimmt", der Compiler merkt sich einfach, was du beim 
Array-Anlegen angegeben hast.

Mit dynamisch allozierten Arrays klappt das mit dem Template natürlich 
nicht mehr.

von jb (Gast)


Lesenswert?

Er zählt die Elemente:
const int values[] = { 1,2,3,7 };

gruß jb

von Sebastian V. (sebi_s)


Lesenswert?

Die Maschinerie dazu nennt sich Template Argument Deduction. Deine 
Funktion hat 2 template Parameter und erwartet eine Referenz auf ein 
Array von Ts mit N Elementen. Wenn du diese Funktion mit einem Array 
aufrufst versucht der Compiler den Typ T und den Wert N vom übergebenen 
Typ abzuleiten. Wie der Compiler das genau tut ist durch zahlreiche 
Regeln festgelegt, die nicht gerade einfach sind, aber oft das tun was 
man intuitiv erwartet. Wenn du die Funktion mit etwas anderem als einem 
Array aufrufst, einem Pointer z.B. dann wird Template Argument Deduction 
fehlschlagen und es gibt einen Fehler vom Compiler. Falls du mehr über 
diese Thema wissen möchtest kann ich dir dieses Video (und auch alle 
anderen Videos von STL) empfehlen: 
http://channel9.msdn.com/Series/C9-Lectures-Stephan-T-Lavavej-Core-C-/Stephan-T-Lavavej-Core-C-2-of-n

Edit: Ich weiß nicht was du genau mit der Funktion erreichen willst aber 
wenn du nur einfach einem std::vector Werte zuweisen willst dann gibt es 
seit C++11 praktische initializer lists mit denen folgender Code möglich 
ist:
std::vector<double> array = { 1,2,3,7 };

: Bearbeitet durch User
von Benny (Gast)


Lesenswert?

Danke.
Template Deduction war das Stichwort. Kannte diese Regel gar nicht.

von Vlad T. (vlad_tepesch)


Lesenswert?

im Übrigen gibt es für diesen Fall (ein vector fester größe) ein 
standard container, der ein C-Array wrappt, ohne weiteren Overhead:
std::arrray

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.