que punteros puntero parametros funciones declaracion como cadenas arreglos c++ arrays c++11 stl stdarray

c++ - punteros - ¿Por qué no puedo copiar una matriz de estilo C en std:: array?



punteros y arreglos en c (3)

Como ya se mencionó, el problema aquí es que las matrices decaen a los punteros cuando se pasan a una función, lo que significa que el tamaño no se conserva.

Sin embargo, si supiera que había 16 elementos en la matriz, podría hacer esto:

array<int,16> copyarray(const int input[]) { array<int, 16> result; copy_n(input, size(result), begin(result)); return result; }

Esta pregunta ya tiene una respuesta aquí:

Tengo este codigo

std::array<int,16> copyarray(int input[16]) { std::array<int, 16> result; std::copy(std::begin(input), std::end(input), std::begin(result)); return result; }

Cuando intento compilar este código, recibo este error:

''std::begin'': no matching overloaded function found

y un error similar para std::end .

¿Cuál es el problema y cómo puedo solucionarlo?


En la declaración de parámetros, int input[16] es igual que int* input . Y cuando se pasa el argumento, la matriz se descompondría en puntero , ambos significan que la información sobre el tamaño de la matriz se pierde. Y std::begin y std::end no pueden funcionar con punteros.

Podría cambiarlo a paso por referencia, que reserva el tamaño de la matriz.

std::array<int,16> copyarray(int (&input)[16])

Tenga en cuenta que ahora solo puede pasar la matriz con un tamaño exacto de 16 a la función.


Todo lo importante ya lo said , puede obtener la función un poco más flexible:

template <typename T, size_t N> std::array<T, N> copyarray(T const (&input)[N]) { std::array<T, N> result; std::copy(std::begin(input), std::end(input), std::begin(result)); return result; }