Puoi "apprendere" automaticamente le dimensioni dell'array:
template<typename T, size_t N>
void set_data(const T (&w)[N]){
w_.assign(w, w+N);
}
Eventualmente, puoi cambiare l'interfaccia in set_data come sopra. Accetta ancora un array in stile C come primo argomento. Capita solo di prenderlo per riferimento.
Come funziona
[Aggiornamento: vedi qui per una discussione più completa sull'apprendimento delle dimensioni]
Ecco una soluzione più generale:
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);
}
Questo funziona perché l'array viene passato come riferimento a un array. In C / C ++, non è possibile passare una matrice come funzione, invece decadrà in un puntatore e si perderanno le dimensioni. Ma in C ++, puoi passare un riferimento all'array.
Il passaggio di un array per riferimento richiede che i tipi corrispondano esattamente. La dimensione di un array fa parte del suo tipo. Ciò significa che possiamo usare il parametro modello N per imparare le dimensioni per noi.
Potrebbe essere ancora più semplice avere questa funzione che restituisce un vettore. Con le ottimizzazioni del compilatore appropriate in atto, questo dovrebbe essere più veloce di quanto sembri.
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);
}