Viendo que estás usando un arreglo bidimensional de dimensiones conocidas en tiempo de compilación, yo aprovecharía las siguientes utilidades de la librería de algoritmos (<algorithm>
) de C++:
std::min_element
: Busca el menor elemento en el rango [primero, último).
std::transform
: Aplica la función proporcionada al rango facilitado y almacena el resultado en el otro rango proveído.
Con estas utilidades podrías tener este código:
for (auto &fila : mas)
{
auto menor = *min_element(begin(fila), end(fila));
transform(begin(fila), end(fila), begin(fila), [&menor](const auto &valor)
{
return valor - menor;
});
}
El bucle for
de rango nos recorre el arreglo fila a fila, buscamos el menor elemento de la fila con std::min_element
a la que le pasamos el inicio y el final de la fila (begin(fila)
y end(fila)
)1, como ésta función devuelve un iterador debemos des-referenciarlo para obtener el valor menor.
Acto seguido usamos el valor menor que acabamos de encontrar en std::transform
al que le decimos que queremos transformar la fila de principio a final (begin(fila)
y end(fila)
) y que dicha transformación la guardaremos en la misma fila (begin(fila)
); la transformación que aplicamos es una lambda2 que resta el menor valor a todo valor recibido.
Puedes ver el código funcionando en Wandbox 三へ( へ՞ਊ ՞)へ ハッハッ.
1std::begin
y std::end
.
2Expresión Lambda.