Sie können die Größe des Arrays automatisch "lernen":
template<typename T, size_t N>
void set_data(const T (&w)[N]){
w_.assign(w, w+N);
}
Hoffentlich können Sie die Schnittstelle wie oben in set_data ändern. Es akzeptiert weiterhin ein Array im C-Stil als erstes Argument. Es nimmt es einfach als Referenz.
Wie es funktioniert
[Update: Sehen Sie hier für eine umfassendere Diskussion über die Größe Lernen]
Hier ist eine allgemeinere Lösung:
template<typename T, size_t N>
void copy_from_array(vector<T> &target_vector, const T (&source_array)[N]) {
target_vector.assign(source_array, source_array+N);
}
Dies funktioniert, weil das Array als Referenz auf ein Array übergeben wird. In C / C ++ können Sie ein Array nicht als Funktion übergeben, sondern es zerfällt in einen Zeiger und Sie verlieren die Größe. In C ++ können Sie jedoch einen Verweis auf das Array übergeben.
Um ein Array als Referenz zu übergeben, müssen die Typen genau übereinstimmen. Die Größe eines Arrays ist Teil seines Typs. Dies bedeutet, dass wir den Vorlagenparameter N verwenden können, um die Größe für uns zu lernen.
Es könnte noch einfacher sein, diese Funktion zu haben, die einen Vektor zurückgibt. Bei entsprechenden Compiler-Optimierungen sollte dies schneller sein, als es aussieht.
template<typename T, size_t N>
vector<T> convert_array_to_vector(const T (&source_array)[N]) {
return vector<T>(source_array, source_array+N);
}