Ich bin in bestimmten Zusammenhängen verwirrt über die Min- und Max-Funktionen.
In einem Kontext gibt es kein Problem, wenn Sie die Funktionen verwenden, um den größeren oder kleineren von zwei Werten zu übernehmen. Zum Beispiel,
//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);
}
Einfach. Aber in einem anderen Kontext bin ich verwirrt. Wenn ich versuche, ein Maximum oder ein Minimum festzulegen, verstehe ich es rückwärts.
//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
}
Ist es nicht ratsam, meine eigenen Funktionen wie folgt zu erstellen?
//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)
}
Die Verwendung der eingebauten Funktionen ist natürlich schneller, aber dies scheint mir eine unnötige Mikrooptimierung zu sein. Gibt es einen anderen Grund, warum dies nicht ratsam wäre? Was ist mit einem Gruppenprojekt?
std::clamp
Funktion oder ähnliches in Betracht ziehen .
up_to
(für min
) und at_least
(für max
)? Ich denke, sie vermitteln die Bedeutung besser als minimize
usw., obwohl es einen Moment dauern kann, bis klar wird, warum sie kommutativ sind.
min
und max
und minimize
und maximize
sind völlig falsche Namen für die Funktionen, die Sie schreiben möchten. Der Standard min
und max
viel sinnvoller. Sie haben tatsächlich fast die richtigen Funktionsnamen. Diese Operation wird als Clamping oder Capping bezeichnet, und Sie haben zwei Capping-Funktionen geschrieben. Ich würde vorschlagen capUpperBound
und capLowBound
. Ich muss niemandem erklären, wer was tut, das liegt auf der Hand.