给定一个实数(n),该实数的最大值可以是(上),而该实数的最小值可以是(下),我们如何最有效地裁剪n,使其保持在上下限之间?
当然,使用一堆if语句可以做到这一点,但这很无聊!那么更紧凑,优雅/有趣的解决方案呢?
我自己的快速尝试(C / C ++):
float clip( float n, float lower, float upper ) { n = ( n > lower ) * n + !( n > lower ) * lower; return ( n < upper ) * n + !( n < upper ) * upper; }
我敢肯定还有其他更好的方法可以做到这一点,这就是为什么我要把它放在那里。
那么无聊,古老,可读和最短的时间呢?
float clip(float n, float lower, float upper) { return std::max(lower, std::min(n, upper)); }
?
该表达式也可以像这样被“通用化”:
template <typename T> T clip(const T& n, const T& lower, const T& upper) { return std::max(lower, std::min(n, upper)); }
更新资料
Billy ONeal添加了:
请注意,在Windows上,您可能必须定义NOMINMAX,因为它们定义了冲突的最小和最大宏