std::min
on cppreference和原始 stl中的实现如下所示:
return (b < a) ? b : a;
但我认为这更具可读性:
return (a < b) ? a : b;
这让我想知道:两种实现是否等效?是否有特定的原因使其按原样实施?
std::min
on cppreference和原始 stl中的实现如下所示:
return (b < a) ? b : a;
但我认为这更具可读性:
return (a < b) ? a : b;
这让我想知道:两种实现是否等效?是否有特定的原因使其按原样实施?
如果它们相等,这两种不同的实现将确定您是选择第一个对象还是第二个对象作为最小值,这可能会对对象产生影响,如果不是原始类型的话。
这一点,再加上一些其他算法的实现可能会产生更大的影响。例如,如果排序算法使用min(a[i], a[j])
wherei < j
和a[i]
anda[j]
具有相同的值,第一个实现将导致元素之间没有交换,而第二个实现会导致排序不稳定。
注意:正如BoBTFish提到的,C++11 标准保证 min 和 max 都返回最左边的最小值:
25.4.7:
3备注:当参数相等时返回第一个参数
6备注:当多个参数等价于最小的时,返回最左边参数的副本
实现方式不一样。如果 a 和 b 相等,在任一实现中会发生什么?一个将返回对 a 的引用,一个将返回对 b 的引用。值当然是相同的。但是考虑一个结构,其中比较函数只关心一个值,但其他一些值是不同的。这可能对试图保证稳定排序的排序函数产生重大影响。
最终这是一种风格选择,在相等的情况下我们应该返回第一个参数还是第二个参数?然而,既然已经做出了这种风格选择,保持不变就非常重要,这就是为什么存在标准定义之类的东西的原因!
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf
搜索关于最大值和最小值的“25.4.7”。
-- 不正确的答案 -- 见评论 -- bb
FWIW,我没有观察到 STL 被编写为特别容易阅读,但它非常简单;在这种情况下,获得相同结果的唯一其他可能方法是
return (a <= b) ? a : b;
这将是另外一个字符,而且,恕我直言,实际上并不那么容易阅读。此外,请参阅上面@Shahbaz 关于排序稳定性的评论——像 min 这样的操作具有明确定义的包容性和排他性行为。
TL;DR 因为“小于”与“小于或等于”不同
请参阅下面的评论——这个答案在 C 中作为宏是正确的,但在 C++ 中实际上是不正确的,原因在下面的评论中解释。我将其标记为不正确,但将其保留,因为评论有用且易于理解。如果我为任何人混淆了这个问题,我深表歉意。