Możesz `` nauczyć się '' rozmiaru tablicy automatycznie:
template<typename T, size_t N>
void set_data(const T (&w)[N]){
w_.assign(w, w+N);
}
Mamy nadzieję, że możesz zmienić interfejs na set_data jak powyżej. Nadal akceptuje tablicę w stylu C jako pierwszy argument. Po prostu bierze to przez odniesienie.
Jak to działa
[Aktualizacja: zobacz tutaj, aby uzyskać bardziej kompleksową dyskusję na temat poznania rozmiaru]
Oto bardziej ogólne rozwiązanie:
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);
}
Działa to, ponieważ tablica jest przekazywana jako odniesienie do tablicy. W C / C ++ nie możesz przekazać tablicy jako funkcji, zamiast tego rozpadnie się ona na wskaźnik i stracisz rozmiar. Ale w C ++ możesz przekazać referencję do tablicy.
Przekazywanie tablicy przez odwołanie wymaga dokładnego dopasowania typów. Rozmiar tablicy jest częścią jej typu. Oznacza to, że możemy użyć parametru szablonu N, aby poznać za nas rozmiar.
Jeszcze prostsze może być posiadanie funkcji zwracającej wektor. Po zastosowaniu odpowiednich optymalizacji kompilatora powinno to być szybsze niż się wydaje.
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);
}