Я запутался в функциях min и max в определенных контекстах.
В одном контексте, когда вы используете функции для получения большего или меньшего из двух значений, это не проблема. Например,
//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);
}
Легко. Но в другом контексте я запутался. Если я пытаюсь установить максимум или минимум, я получаю это задом наперед.
//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
}
Нецелесообразно ли выполнять свои собственные функции следующим образом?
//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)
}
Очевидно, что использование встроенных функций будет быстрее, но для меня это кажется ненужной микрооптимизацией. Есть ли другая причина, по которой это было бы нецелесообразно? Как насчет группового проекта?
std::clamp
или что-то подобное.
up_to
(для min
) и at_least
(для max
)? Я думаю, что они передают значение лучше, чем minimize
, и т. Д., Хотя может потребоваться мгновение, чтобы понять, почему они коммутативны.
min
а max
также и также minimize
и maximize
совершенно неправильные названия для функций, которые вы хотите написать. По умолчанию min
и max
имеет гораздо больше смысла. Вы фактически ПОЛУЧИЛИ правильные имена функций. Эта операция называется фиксацией или укупоркой, и вы написали две функции укупорки. Я бы предложил capUpperBound
и capLowBound
. Мне не нужно никому объяснять, что делает, это очевидно.