std::min
函数的实现在cppreference和原始STL中都是这样的:
return (b < a) ? b : a;
但我认为这个版本更易读:
return (a < b) ? a : b;
让我想知道:这两种实现是否等效?为什么实现方式是这样的?
std::min
函数的实现在cppreference和原始STL中都是这样的:
return (b < a) ? b : a;
但我认为这个版本更易读:
return (a < b) ? a : b;
如果两种不同的实现在相等时选择第一个还是第二个对象作为最小值,则可能会对对象产生影响,但对于基本类型来说则没有区别。
这与其他算法的实现结合起来可能会产生更大的影响。例如,如果排序算法使用min(a[i], a[j])
,其中i < j
且a[i]
和a[j]
具有相同的值,则第一种实现将导致元素之间没有交换,而第二种实现则会进行交换,使排序不稳定。
25.4.7:
3 备注:当参数相等时返回第一个参数
6 备注:当多个参数等于最小值时,返回最左边的参数的副本
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf
搜索"25.4.7"以了解最大值和最小值。
--INCORRECT ANSWER--请查看评论--bb
就我个人的观察而言,STL并不是为了特别易于阅读而编写的,但它非常简洁美观;在这种情况下,要获得相同的结果,唯一可能的另一种方法是
return (a <= b) ? a : b;
这将会是一个更多的字符,并且,在我看来,实际上不太容易阅读。此外,请参见@Shahbaz关于排序稳定性的评论--像min这样的操作对于包含和排除具有明确定义的行为。
简而言之,因为“小于”不等同于“小于或等于”
请参见下面的评论--这个答案在C中作为宏是正确的,但是由于下面评论中解释的原因,在C++中实际上是不正确的。我将其标记为不正确,但保留它,因为评论对于理解很重要和有用。如果我让任何人感到困惑,我深表歉意。
<
和 ==
而不是 <=
,可能是为了更容易地重载运算符。 - Yakk - Adam Nevraumont<=
不仅仅是一个字符,它是一个完全不同的运算符,与<
或==
完全无关。 - Christian Rau<=
与 < || ==
没有任何关系。 - Christian Rau
max
函数时是否有某种对称性?即强调比较中的翻转而不是返回值中的翻转。 - BoBTFishstd::min
允许两种不同类型,它们的返回类型也会不同(一个将是decltype(b)
,另一个将是decltype(a)
)。 - Yakk - Adam Nevraumontmin
和max
函数会在c++11
的initializer_list
版本中返回“当参数相等时返回第一个参数”或“当多个参数等于最小值时返回最左边的参数的副本”。(25.4.7) - BoBTFish