c++ array zu vektor

Gast #3929160
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
Gast #3929216
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.
#3929258
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 };

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.