Vous pouvez `` apprendre '' automatiquement la taille du tableau:
template<typename T, size_t N>
void set_data(const T (&w)[N]){
w_.assign(w, w+N);
}
J'espère que vous pouvez changer l'interface en set_data comme ci-dessus. Il accepte toujours un tableau de style C comme premier argument. Il arrive juste de le prendre par référence.
Comment ça fonctionne
[Mise à jour: voir ici pour une discussion plus complète sur l'apprentissage de la taille]
Voici une solution plus générale:
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);
}
Cela fonctionne car le tableau est passé en tant que référence à un tableau. En C / C ++, vous ne pouvez pas passer un tableau en tant que fonction, au lieu de cela, il se désintégrera en un pointeur et vous perdrez la taille. Mais en C ++, vous pouvez passer une référence au tableau.
Passer un tableau par référence nécessite que les types correspondent exactement. La taille d'un tableau fait partie de son type. Cela signifie que nous pouvons utiliser le paramètre de modèle N pour connaître la taille pour nous.
Il pourrait être encore plus simple d'avoir cette fonction qui renvoie un vecteur. Avec les optimisations du compilateur appropriées en vigueur, cela devrait être plus rapide qu'il n'y paraît.
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);
}