examples biblioteca array c++ c++11 stdarray

c++ - biblioteca - ¿Por qué std:: array no tiene un constructor que tome un valor para que la matriz se llene?



std::array c++ (4)

Es la ausencia de

std::array<T,size>::array(const T& value);

¿un descuido? Me parece muy útil, y los contenedores dinámicos (como std::vector ) tienen un constructor similar.

Soy plenamente consciente de

std::array<T,size>::fill(const T& value);

pero eso no es un constructor, y la memoria será puesta a cero primero. ¿Qué pasa si quiero todo -1 como este tipo ?


En primer lugar, no es std::array<T> , es std::array<T,N> donde N es la expresión integral constante de tiempo de compilación.

Segundo, std::array se agrega por diseño. Por lo tanto, no tiene nada que lo haga no agregado, por lo que no tiene constructor ... y destructor, funciones virtuales, etc.


Puede usar la std::index sequence para eso:

namespace detail { template <typename T, std::size_t...Is> std::array<T, sizeof...(Is)> make_array(const T& value, std::index_sequence<Is...>) { return {{(static_cast<void>(Is), value)...}}; } } template <std::size_t N, typename T> std::array<T, N> make_array(const T& value) { return detail::make_array(value, std::make_index_sequence<N>()); }

Demo

std::make_index_sequence es C ++ 14, pero puede implementarse en C ++ 11.


Tenga en cuenta que puede simular de manera eficiente este tipo de constructor aprovechando el hecho de que la matriz no se inicializa en cero, y tiene un constructor de copia y lo hace.

template <size_t N, class T> array<T,N> make_array(const T &v) { array<T,N> ret; ret.fill(v); return ret; } auto a = make_array<20>(''z'');


std::array es, por diseño, un agregado, por lo que no tiene constructores declarados por el usuario.

Como dices, podrías usar fill después de la construcción predeterminada. Dado que es un agregado, la construcción predeterminada no pondrá a cero la memoria, pero la dejará sin inicializar (si el tipo contenido es trivialmente inicializable).