执行std :: min

时间:2013-06-13 13:55:57

标签: c++

cppreferenceoriginal stlstd::min的实施如下:

return (b < a) ? b : a;

但我认为这更具可读性:

return (a < b) ? a : b;

这让我想知道:这两种实现是否相同?是否有一个特殊原因可以实现它?

3 个答案:

答案 0 :(得分:6)

两种不同的实现将决定你是否选择第一个或第二个对象作为最小对象,如果不是原始类型,这可能会对对象产生影响。

这与其他一些算法的实现相结合可能会产生更大的影响。例如,如果排序算法使用min(a[i], a[j]),其中i < ja[i]a[j]具有相同的值,则第一个实现将导致元素之间没有交换,而第二个实现确实如此,使排序不稳定。


注意:正如BoBTFish所述,C ++ 11标准保证min和max都返回最左边的最小值:

  

25.4.7:

     

3 备注:当参数等效时返回第一个参数

     

6 备注:当多个参数等同于最小的

时,返回最左边的参数的副本

答案 1 :(得分:4)

实施方式不尽相同。如果a和b相等,那么在任一实现中会发生什么?一个将返回对一个的引用将返回对b的引用。当然价值是相同的。但是考虑一个结构,其中比较函数只关心一个值,但是其他一些值是不同的。这可能对尝试保证稳定排序的排序函数产生重大影响。

最终它是一种风格选择,如果相等,我们应该返回第一个或第二个参数吗?但是,既然已经做出了这种风格选择,它仍然是相同的非常重要,这就是为什么存在标准定义这样的原因!

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf

搜索关于最大值和最小值的“25.4.7”。

答案 2 :(得分:-1)

- 不正确的答案 - 见评论 - bb

FWIW,我的观察并不是说STL写得特别容易阅读,但它很简单;在这种情况下,获得相同结果的唯一其他可能方法是

return (a <= b) ? a : b;

这将是另一个角色,而且,恕我直言,实际上并不那么容易阅读。另外,请参阅@Shahbaz上面关于排序稳定性的评论 - 像min这样的操作对包容性和排他性有明确的行为。

TL; DR因为“小于”与“小于或等于”

不同

请参阅下面的评论 - 这个答案作为C中的宏是正确的,但实际上在C ++中是不正确的,原因在下面的评论中有解释。我将此标记为不正确但将其留下,因为评论有用且很重要。如果我把这个问题搞砸了,我很抱歉。