W niektórych kontekstach jestem zdezorientowany funkcjami min i max.
W jednym kontekście, gdy używasz funkcji do przyjęcia większej lub mniejszej z dwóch wartości, nie ma problemu. Na przykład,
//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);
}
Łatwo. Ale w innym kontekście jestem zdezorientowany. Jeśli próbuję ustawić maksimum lub minimum, otrzymuję je wstecz.
//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
}
Czy nie jest wskazane, aby tworzyć własne funkcje w następujący sposób?
//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)
}
Oczywiście korzystanie z wbudowanych będzie szybsze, ale wydaje mi się to niepotrzebną mikrooptymalizacją. Czy jest jakiś inny powód, dla którego byłoby to niewskazane? A co z projektem grupowym?
std::clampfunkcji lub coś podobnego.
up_to(dla min) i at_least(dla max)? Myślę, że przekazują znaczenie lepiej niż minimizeitp., Chociaż może chwilę zastanowić się, dlaczego są przemienni.
mina maxtakże minimizei maximizesą całkowicie błędnymi nazwami funkcji, które chcesz napisać. Domyślne mini maxmają znacznie większy sens. W rzeczywistości PRAWIE masz prawidłowe nazwy funkcji. Ta operacja nazywa się zaciskaniem lub zamykaniem i napisałeś dwie funkcje zamykania. Sugerowałbym capUpperBoundi capLowBound. Nie muszę nikomu wyjaśniać, co robi, co jest oczywiste.