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;
}