Mi confondo sulle funzioni min e max, in determinati contesti.
In un contesto, quando si utilizzano le funzioni per accettare il maggiore o il minore di due valori, non vi è alcun problema. Per esempio,
//how many autographed CD's can I give out?
int howManyAutographs(int CDs, int Cases, int Pens)
{
//if no pens, then I cannot sign any autographs
if (Pens == 0)
return 0;
//I cannot give away a CD without a case or a case without a CD
return min(CDs, Cases);
}
Facile. Ma in un altro contesto, mi confondo. Se sto cercando di impostare un massimo o un minimo, lo ottengo indietro.
//return the sum, with a maximum of 255
int cappedSumWRONG(int x, int y)
{
return max(x + y, 255); //nope, this is wrong
}
//return the sum, with a maximum of 255
int cappedSumCORRECT(int x, int y)
{
return min(x + y, 255); //much better, but counter-intuitive to my mind
}
È sconsigliabile svolgere le mie funzioni come segue?
//return x, with a maximum of max
int maximize(int x, int max)
{
return min(x, max);
}
//return x, with a minimum of min
int minimize(int x, int min)
{
return max(x, min)
}
Ovviamente, usare i builtin sarà più veloce ma a me sembra una inutile microottimizzazione. C'è qualche altro motivo per cui questo sarebbe sconsigliabile? Che dire di un progetto di gruppo?
std::clamp
funzione o qualcosa di simile.
up_to
(per min
) e at_least
(per max
)? Penso che trasmettano il significato meglio di minimize
, ecc. Anche se potrebbe volerci un attimo per capire perché sono commutativi.
min
e max
anche minimize
e maximize
sono nomi totalmente sbagliati per le funzioni che vuoi scrivere. L'impostazione predefinita min
e ha max
molto più senso. In realtà QUASI hai i nomi delle funzioni giusti. Questa operazione si chiama bloccaggio o tappatura e sono state scritte due funzioni di tappatura. Suggerirei capUpperBound
e capLowBound
. Non devo spiegare a nessuno quale fa, è ovvio.