Si puo 'imparare' la dimensione dell'array automaticamente:
template<typename T, size_t N>
void set_data(const T (&w)[N]){
w_.assign(w, w+N);
}
Eventualmente, è possibile modificare l'interfaccia per set_data come sopra. Accetta ancora un array in stile C come primo argomento. Capita semplicemente di prenderlo per riferimento.
Come funziona
[Update: Vedere here per una discussione più completa per l'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 una funzione, ma decadrà in un puntatore e si perde la dimensione. Ma in C++, è possibile passare un riferimento alla matrice.
Il passaggio di un array per riferimento richiede che i tipi corrispondano esattamente. La dimensione di un array è parte del suo tipo. Ciò significa che possiamo utilizzare il parametro del modello N per apprendere la dimensione per noi.
Potrebbe essere ancora più semplice avere questa funzione che restituisce un vettore. Con le opportune ottimizzazioni del compilatore in vigore, 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);
}
fonte
2013-10-17 17:01:53
Il nocciolo del problema è che non è possibile per il vettore sapere se lo stesso allocatore è stato utilizzato per creare l'array in stile C. In quanto tale, il vettore deve allocare la memoria utilizzando il proprio allocatore. Altrimenti potrebbe semplicemente sostituire l'array sottostante e sostituirlo con l'array. – Void