Мене плутають функції 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. Мені не потрібно нікому пояснювати, хто з них робить, це очевидно.