Мене плутають функції 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
мають набагато більше сенсу. Ви фактично ALMOST отримали правильні назви функцій. Ця операція називається затисканням або обмеженням, і ви написали дві функції обмеження. Я б запропонував capUpperBound
і capLowBound
. Мені не потрібно нікому пояснювати, хто з них робить, це очевидно.