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::clampfunzione 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.
mine maxanche minimizee maximizesono nomi totalmente sbagliati per le funzioni che vuoi scrivere. L'impostazione predefinita mine ha maxmolto 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 capUpperBounde capLowBound. Non devo spiegare a nessuno quale fa, è ovvio.