Ви можете "дізнатися" розмір масиву автоматично:
template<typename T, size_t N>
void set_data(const T (&w)[N]){
w_.assign(w, w+N);
}
Сподіваємось, ви можете змінити інтерфейс на set_data, як зазначено вище. Він все ще приймає масив у стилі С як перший аргумент. Просто трапляється взяти це за посиланням.
Як це працює
[Оновлення: див. Тут для більш всебічної дискусії щодо вивчення розміру]
Ось більш загальне рішення:
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);
}
Це працює, тому що масив передається як посилання на масив. У C / C ++ ви не можете передати масив як функцію, натомість він розкладеться на покажчик і ви втратите розмір. Але в C ++ ви можете передати посилання на масив.
Для передачі масиву за посиланням потрібні типи точно збігатися. Розмір масиву є частиною його типу. Це означає, що ми можемо використовувати параметр шаблону N, щоб дізнатися розмір для нас.
Можливо, ще простіше мати цю функцію, яка повертає вектор. При застосуванні відповідних оптимізацій компілятора це має бути швидшим, ніж це виглядає.
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);
}